首页 > 解决方案 > 从 for 循环到数据框的结果,然后到 csv

问题描述

我有一份学校名单和他们提供的课程。我还有一份独特的课程列表,其中只有一些在各个学校提供,而有些则不提供。我创建了一个循环,输出与学校名称配对的每所学校的缺失课程,但是我无法将 for 循环中的整个结果输出到 csv。

我已经能够将一所学校的课程写入 csv,但是我无法将包含所有学校的 for 循环的整个结果写入 csv。

我知道我需要将 for 循环的结果插入到数据框中。下一步将遍历数据帧并将结果逐行发送到 csv,但我首先需要将结果从 for 循环中获取到数据帧中。

读入数据帧

schools = {'School': ['School A', 'School A', 'School A', 'School B', 'School B', 'School B', 'School C','School C', 'School D'], 'Class': ['Math', 'Chemistry', 'English', 'Math', 'Chemistry', 'English', 'Math', 'Chemistry', 'Physics']}
dfSchool = pd.DataFrame(data=schools)
dfSchool


classes = {'Class': ['Math', 'Chemistry', 'English', 'History', 'Physics']}
dfClasses = pd.DataFrame(data=classes)
dfClasses

循环

grouped = dfSchool.groupby('School')

for name, group in grouped:
    print(name)
    print(dfClasses[~(dfClasses.Class.isin(group["Class"]))])

将 for 循环的结果放入数据框中(此代码不起作用)

listFinal = []
for name, group in grouped:
    print(name)
    print(dfClasses[~(dfClasses.Class.isin(group["Class"]))])
    listFinal.append(name)
    listFinal.append(dfClasses[~(dfClasses.Class.isin(group["Class"]))])

dfOutput = pd.DataFrame(listFinal)
dfOutput.to_csv('SchoolClasses.csv', index=True)

实际结果:控制台包含以下输出,但是当写入 csv 时,我只在文件中得到学校 A。我希望将下面的整个输出(所有学校)写入 csv 文件。

School A
     Class
3  History
4  Physics
School B
     Class
3  History
4  Physics
School C
     Class
2  English
3  History
4  Physics
School D
       Class
0       Math
1  Chemistry
2    English
3    History

期望的结果:上述输出,但在单个 csv 文件中。如果您可以将学校名称放在其各自班级的每一行中,而不仅仅是将学校名称作为标题,则可以加分。

当试图将 for 循环的结果放入数据框中时,我得到:

listFinal

['School A',      Class
 3  History
 4  Physics, 'School B',      Class
 3  History
 4  Physics, 'School C',      Class
 2  English
 3  History
 4  Physics, 'School D',        Class
 0       Math
 1  Chemistry
 2    English
 3    History]

标签: pythonpython-3.xpandas

解决方案


一种选择是使用pandas.DataFrame.groupby.apply

import pandas as pd


schools = {'School': ['School A', 'School A', 'School A', 
                      'School B', 'School B', 'School B',
                      'School C', 'School C', 'School D'],
           'Class': ['Math', 'Chemistry', 'English',
                     'Math', 'Chemistry', 'English',
                     'Math', 'Chemistry', 'Physics']
           }

classes = {'Class': ['Math', 'Chemistry', 'English', 'History', 'Physics']}

df_school = pd.DataFrame(data=schools)
df_classes = pd.DataFrame(data=classes)

missing = (df_school.groupby('School')
                    .apply(lambda group: df_classes[~(df_classes["Class"].isin(group["Class"]))])
                    .droplevel(-1)
                    )
missing.to_csv("missing_classes.csv")

结果:

>>> missing
              Class
School             
School A    History
School A    Physics
School B    History
School B    Physics
School C    English
School C    History
School C    Physics
School D       Math
School D  Chemistry
School D    English
School D    History

缺失类.csv

学校,A
班,历史
A,物理
B,历史
B,物理
C,英语
C,历史
C,物理
D,数学
D,化学
D,英语
D,历史


推荐阅读