Разделить несколько листов Excel по одному столбцу в Python - PullRequest
2 голосов
/ 30 сентября 2019

Для примера файла Excel students_data.xlsx, который имеет 3 листа: students_name, students_score и students_age

student_name :

   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

Students_age

   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

показатель_участника

   id class  score
0   1     a     66
1   2     a     77

Students_age

   id class  age
0   1     a   15
1   2     a   14

b.xlsx будет выглядеть как a.xlsx, но содержит только class euquals to b.

Как правильно разделить и сохранить файлы Excel? Спасибо.

1 Ответ

3 голосов
/ 30 сентября 2019

Сначала создайте словарь всех DataFrames с помощью параметра sheet_name=None.

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

Затем получите все возможные классы, извлекая значения из столбца class, сгладьте и преобразуйте в набор.

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

Последний цикл каждого значения набора, создать новый 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)
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...