工作中需要处理各种电子表格文件,这里记录一下常用的pandas功能,免得总是网上查来查去。
数据读取
pandas有读取许多不同格式的表格数据文件的方法,方法名一般是 .read
开头。例如读取 csv 文件是 pd.read_csv()
, 读取 excel 文件是 pd.read_excel()
。需要注意的是,读取excel文件,需要 pip 安装 openpyxl
, xlrd
等模块。
这些读取函数首先要输入需要读取文件的路径,然后支持其它的参数来指定别的读取方式。比如有些csv文件的列名并不是第一行,这个时候就需要设置 header=?
,例如我之前读取 imaris 分析后导出的数据。然后有些时候文件编码可能是 GBK(支持中文显示),所以需要添加参数设置 encoding=GBK
。
类似的 pd.read_excel也可以指定要读取的sheet_name,这些都可以快速查看函数文档获知。
数据整理
读取了数据表之后,有些时候原始表格的列名特别复杂,所以为了方便后面处理,最好对 column_name 重新命名,通常可以使用 df.columns=['a', 'b', 'c' ..]
这样的方式来重命名。但如果列特别多,然后你仅需要提取其中部分列的时候,可以使用 df2 = df.filter(items=['a', 'b', 'c'])
的方式先进行过滤,然后再重命名。
然后可以按指定列的值进行分组,这个时候可以用 gp = df2.groupby(by=['a', 'b])
的方式创建分组对象,这里就是按照a列和b列中的值进行分组,接着提取其中某个指定分组的方式是 df3 = gp.get_group(('cat', '2'))
,其中 cat 是 a 列中的某个值, 2 是 b列中某个值。如果要对所有分组进行遍历可以使用 for key, df in gp:
来处理。
数据列计算
得到某个指定分组的分表数据,接下来可以按需进行各种计算。当需要进行遍历时,可以使用 for idx, row in df3.iterrows():
的方式来遍历,这样速度快。如果需要对指定列进行计算并将结果更新,可以直接df['a'] = func(df['a'])
,其中func代表某个函数。常见的比如对日期字符串的处理,转换为datetime对象方便后面日期时间的计算,可以使用 df['datetime'] = pd.to_datetime(df['datetime'], format='%Y/%m/%d %H:%M:%S')
。对特定列的处理,pandas 还提供了 apply 的方法来进行批量处理,例如:out['hours'] = out['duration'].apply(lambda x:f"{x.total_seconds()/3600:.2f}")
,就能够将duration列的datetime duration对象转换为小时数字符串。需要注意这里使用了 lambda 表达式,其中 x 就代表这一个列中的可迭代的 item,然后冒号之后就是对这个 item 的处理(也可以是一个自定义函数)。
数据汇总
通常我会用一个空列表(box)把各个数据块的处理结果(也是dataframe对象)收集起来,然后通过.concat
方法进行合并。out=pd.concat(box)
,注意这里默认是纵向拼接数据表,如果是要横向拼接数据表,需要 out=pd.concat(box, axis=1)
。
然后数据表中有一些多余的列要删除,可以使用 out.drop('something', axis=1)
。如果要删除包含空值的无效行,可以使用out.dropna()
即可。但有时候某些表格填报要求用 无
, 这个时候可以使用 out.fillna("无", inplace=True)
。
最后导出数据表的时候,可能还希望对列的顺序进行调整。可以使用一个列表自定义好列名:cols=['b', 'a', 'g']
,然后再直接 out2=out[cols]
即可调整列顺序。需要注意的是 cols 的列表长度必须要 out的列数一致。
数据保存
一般我会习惯于把中间数据表保存为 csv,这个时候使用 out.to_csv('path/to/csv', index=None)
。然后也可以保存为 xlsx 文件,这个时候使用 out.to_excel('path/to/xlsx')
。
小结
平常使用pandas模块还挺多的,这里先记录个大概,后面再进行各种补充。另外,由于pandas的资料非常丰富,现在的大语言模型生成的代码质量也非常高。所以有时候网上搜还不如问AI。
此处评论已关闭