之前我们已经介绍了 pandas的基础使用用法这一期我们来看看这个包其他有意思的方法一、排序1.1 对Series排序对Series的排序主要是两个参数一个是ascending代表是否升序排列另一个就是很熟悉的inplace了123srpd.Series([2,3,8,4,5])sr.sort_values(ascendingFalse,inplaceTrue)# 降序排序同时替换原有DataFrameprint(sr)输出的结果为注意排序后index的顺序也会跟着变2 84 53 41 30 2dtype: int641.2 对DataFrame排序由于DataFrame是二维的因此排序时多了一个参数by表示按照哪一列进行排序同时ascending也支持布尔数组实现多条件的排序如下123456dfpd.DataFrame({A:[B,A,B,B,A],B:[2,3,8,4,5],C:[11,2,7,4,5]})# 单条件排序df.sort_values(byB,ascendingTrue,inplaceTrue)print(df)单条件的排序结果为A B C0 B 2 111 A 3 23 B 4 44 A 5 52 B 8 7而对于多条件排序by和ascending一一对应代表应该是升序还是降序123# 多条件排序df.sort_values(by[A,B],ascending[False,True],inplaceTrue)print(df)多条件排序输出结果如下首先按照A列降序排序然后按照B列升序排序所以有一个主次的关系A B C0 B 2 113 B 4 42 B 8 71 A 3 24 A 5 5二、字符串和日期处理对于字符串的处理我们一般都使用str进行而对于日期我们用dt直接通过底下的代码我们来看123456789101112dfpd.DataFrame({姓名:[张三,李四,王五,赵六,王二],出生日期:[2000-01-01,2001-02-02,2002-03-03,2003-04-04,2004-05-05],分数:[90分,29分,78分,46分,57分]})print(df.dtypes)print(*30)df[出生日期]pd.to_datetime(df[出生日期])# 转换为日期类型print(df[出生日期].dtype)# datetime64[ns]# df[出生日期] df[出生日期].str.replace(1,) # 错误用法str只能为字符串服务df[出生日期]df[出生日期].dt.strftime(%Y-%m-%d)# 转换为字符串类型print(df[出生日期].dtype)# objectdf[分数]df[分数].str.replace(分,).astype(int)# 转换为整数类型print(df)输出如下我们一个一个做分析首先我们定义了一个DataFrame可以发现初始都是字符串因此输出为object然后我们通过to_datetime将其改成了标准的日期格式因此输出为datetime64[ns]同样我们也可以通过dt.strftime将其转换为字符串格式对于字符串格式我们可以使用str下的若干方法进行处理上述演示中只是将“分”这个字删除并转换为整型姓名 object出生日期 object分数 objectdtype: objectdatetime64[ns]object姓名 出生日期 分数0 张三 2000-01-01 901 李四 2001-02-02 292 王五 2002-03-03 783 赵六 2003-04-04 464 王二 2004-05-05 57同时pandas严格约定str只服务于字符串如果对其他格式使用则会报错对于字符串的处理还有一个很强大的工具就是正则表达式我们同样可以使用正则表达式进行处理但是注意使用regexTrue告诉程序这个是正则表达式1234# 常规复杂的三步替换df[出生日期]df[出生日期].str.replace(年,).str.replace(月,).str.replace(日,)# 正则表达式替换df[出生日期]df[出生日期].str.replace([年月日],,regexTrue)三、DataFrame的连接如果需要做DataFrame的连接我们常常使用concat方法其重要的三个参数分别是axis0代表按行连接否则是按列连接ignore_indexTrue表示重新生成一个新的索引否则保留原始索引joinouter表示保留所有非重复字段joininner则表示只保留重合字段123456df1pd.DataFrame({A:[1,2,3],B:[6,7,8]})df2pd.DataFrame({B:[4,5,6],F:[9,10,11]})print(pd.concat([df1,df2],axis1))print(pd.concat([df1,df2],axis0,ignore_indexTrue,joinouter))输出结果为A B B F0 1 6 4 91 2 7 5 102 3 8 6 11A B F0 1.0 6 NaN1 2.0 7 NaN2 3.0 8 NaN3 NaN 4 9.04 NaN 5 10.05 NaN 6 11.0在输出中如果ignore_indexFalse,左侧就是原始索引 [0,1,2,0,1,2]而如果使用joininner则只会保留重合的B列同时Concat还支持DataFrame与Series的混合拼接例如1234sr1pd.Series([1,2,3],namesr1)sr2pd.Series([6,7,8,],namesr2)print(pd.concat([sr1,df1,df2,sr2],axis1))# 混合拼接输出结果为sr1 A B B F sr20 1 1 6 4 9 61 2 2 7 5 10 72 3 3 8 6 11 8四、EXCEL表格批量合并和拆分4.1 批量进行表格合并之前我们已经学习了那么多的pandas使用技巧那么接下来我们就看看上面讲到的比如Concat在实际过程中有什么用吧比如我们先看一下批量的合并既然要合并不过就是DataFrame的拼接在某个文件夹下有若干个xlsx文件我们需要合并到一张表里这些子表的表头都是相同的那么我们通过下面的程序进行合并首先获取文件夹下所有的xlsx文件然后读取DataFrame紧接着添加一个标识列代表从哪个数据表中拿到的最后合并并保存在这里Concat就起到了将各个DataFrame合并在一起的功能1234567891011son_file_pathrC:\Users\22330\Desktop\进行中\子文件file_to_saverC:\Users\22330\Desktop\进行中\Data_combine.xlsxdf_lists[]# 用于存储每个子文件的DataFrameforiteminos.listdir(son_file_path):ifitem.endswith(.xlsx):file_pathos.path.join(son_file_path,item)dfpd.read_excel(file_path)df[son_id]item.split(.)[0]# 提取子文件的id作为新的一列df_lists.append(df)# 将当前子文件的DataFrame添加到列表中# 使用Concat合并所有子文件的DataFramepd.concat(df_lists,axis0).to_excel(file_to_save,indexFalse)最后输出的文件中就会多出我们新增的一列son_id整个的处理非常迅速。4.2 批量进行表格拆分既然已经讲了合并我们顺手也来看看拆分我们的拆分需求是将表格平均分到若干个表里在下面的程序中我通过son_file_num定义了要拆分的个数通过考虑了除不尽的情况然后依次按索引取值放到每个表中123456789101112131415161718192021importpandas as pdimportosfile_pathrC:\Users\22330\Desktop\进行中\Data.xlsxsave_pathrC:\Users\22330\Desktop\进行中\子文件ifnotos.path.exists(save_path):# 如果子文件目录不存在就创建一个os.mkdir(save_path)dfpd.read_excel(file_path)print(df.head(3))# 查看前3行数据print(df.shape)# 查看数据条数和特征数son_file_num4son_file_sizedf.shape[0]//son_file_num# 每个子文件的数据条数ifdf.shape[0]%son_file_num !0:# 如果数据条数不能被子文件数整除需要额外增加一条数据son_file_size1foriinrange(son_file_num):starti*son_file_sizeendstartson_file_sizedf_sondf.iloc[start:end]# 这里的end是不包含在切片中的所以不需要-1df_son.to_excel(f{save_path}\{file_path.split(.)[1]}_{i}.xlsx,indexFalse)命令行输出了我们的一些调试信息可想而知会按152:152:152:150 的比例分配数据实现拆分出库日期 产品经理 产品类别 地区 安全等级 销售额(元) 销售数量 客户评分0 2023-06-01 Jerry 电子产品 西南 C 3789.6 12 5.01 2023-06-02 Cary 服装 华东 A 2345.3 14 5.02 2023-06-03 Bob-Smith 家居用品 西北 D 567.8 7 3.7(606, 8)到此这篇关于Pandas基础使用指南之排序、字符串日期处理和文件合并拆分技巧的文章就介绍到这了