我们之前的案例讲过如何用pandas按行拆分Excel,批量将一个Excel拆分多个Excel,这次我们按列完成拆分。
数据与需求
我们读取我们的demo数据Excel,并修改表头,将后边的列名修改为两组相同的:
import pandas as pd
df = pd.read_excel('https://www.gairuo.com/file/data/team.xlsx')
df = df.head()
df.columns = ['name'] + ['foo']*2 + ['bar']*3
name foo foo bar bar bar
0 Liver E 89 21 24 64
1 Arry C 36 37 37 57
2 Ack A 57 60 18 84
3 Eorge C 93 96 71 78
4 Oah D 65 49 61 86
现在需求是期望将这个Excel按列进行拆分为,每个Excel保留name列。
在案例 pandas 按分组一个分组导出一个文件中,我们是按行分组拆分Excel,本例思路类似,我们还是利用groupby()分组,不过按列分,需要传入axis=1。
为了保证拆分的Excel的首列为name,可将DataFrame的索引先设置为name列:
df = df.set_index('name')
foo foo bar bar bar
Liver E 89 21 24 64
Arry C 36 37 37 57
Ack A 57 60 18 84
Eorge C 93 96 71 78
Oah D 65 49 61 86
再按groupby()分组,按列需要传入axis=1,分组依据是列索引:
df.groupby(df.columns, axis=1)
.apply(lambda x: x.to_excel(f'{x.name}.xlsx'))
# 'Empty DataFrame\nColumns: []\nIndex: []'
可以到脚本当前的目录查看生成的两个excel文件:
如果在构造数据时,我们不修改列名,同时需求修改为将成绩和团队拆分,原数据是这样:
import pandas as pd
df = pd.read_excel('https://www.gairuo.com/file/data/team.xlsx')
df.head()
name team Q1 Q2 Q3 Q4
0 Liver E 89 21 24 64
1 Arry C 36 37 37 57
2 Ack A 57 60 18 84
3 Eorge C 93 96 71 78
4 Oah D 65 49 61 86
我们可以设置手动分组并拆分导出:
# 修改索引
df = df.set_index('name')
# 设置手动分组并拆分导出
df.groupby(['team'] + ['Q']*4, axis=1)
.apply(lambda x: x.to_excel(f'{x.name}.xlsx'))
这样会生成两个文件:team.xlsx和Q.xlsx。
这样就完成了这个需求。
pandas 实战案例集
2023-02-21 19:37:27
pandas 文件或数据的读取和导出
2022-01-22 14:33:56
pandas groupby() 创建分组对象
2022-04-29 21:52:43