在Python中按一列拆分多张Excel文件

时间:2019-09-30 09:01:13

标签: python pandas dataframe

例如一个具有3个工作表的示例excel文件students_data.xlsxstudents_namestudents_scorestudents_age

学生姓名

   id class  name
0   1     a  jack
1   2     a  lucy
2   3     b   joe
3   4     b  even
4   5     b    ho

students_score

   id class  score
0   1     a     66
1   2     a     77
2   3     b     87
3   4     b     60
4   5     b     90

学生年龄

   id class  age
0   1     a   15
1   2     a   14
2   3     b   13
3   4     b   12
4   5     b   14

我已使用以下方法将每个工作表分为不同的类别:

import pandas as pd
df = pd.read_excel("students_data.xlsx", sheet_name="students_name")
for i, g in df.groupby("class"):
    g.to_excel("students_name/{}.xlsx".format(i), index=False, index_label=False)
df = pd.read_excel("students_data.xlsx", sheet_name="students_score")
for i, g in df.groupby("class"):
    g.to_excel("students_score/{}.xlsx".format(i), index=False, index_label=False)
df = pd.read_excel("students_data.xlsx", sheet_name="students_age")
for i, g in df.groupby("class"):
    g.to_excel("students_age/{}.xlsx".format(i), index=False, index_label=False)

但是我想按class按每个excel文件的相同模式进行拆分,例如,对于a.xlsx,它将具有3个与原始文件相同的工作表,但只有class中的数据等于a

最后的a.xlxs将包含以下工作表:

学生姓名

   id class  name
0   1     a  jack
1   2     a  lucy

students_score

   id class  score
0   1     a     66
1   2     a     77

学生年龄

   id class  age
0   1     a   15
1   2     a   14

b.xlsx看起来像a.xlsx,但是只有class等于b包含的数据。

如何正确分割和保存Excel文件?谢谢。

1 个答案:

答案 0 :(得分:3)

首先通过sheet_name=None参数创建所有DataFrame的字典。

dfs = pd.read_excel('students_data.xlsx', sheet_name=None)

然后通过提取列class的值来获取所有可能的类,展平并转换为set。

c = set([y for k, v  in dfs.items() for y in v['class']])
print (c)
{'a', 'b'}

最后循环set的每个值,创建新的file,过滤并创建已过滤行的所有工作表名称:

for i in c:
    with pd.ExcelWriter("students_score/{}.xlsx".format(i)) as writer:
        for k, v in dfs.items():
            v[v['class'] == i].to_excel(writer, index=False, index_label=False, sheet_name=k)