python - 从 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]
解决方案
一种选择是使用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,历史
推荐阅读
- python - 为什么我在使用 matplotlib 时得到一个空图?
- android - 编译安卓内核
- aws-lambda - 将消息从 AWS Lambda 服务发布到 GCP Pub/Sub
- javascript - 在选择的onchange中显示来自mysql的数据不起作用
- android - 如何在 Primary HAL 和 USB Audio HAL 之间配置通话音频?
- symfony - 尝试在 OroPlatform 上注册自定义配置时出错
- r - ggplot2 geom_line 的两个不同图例
- node.js - 无法从节点中的 fetch 响应中解析应用程序/javascript 类型数据
- timing - 独立 HDL 模块的时序分析
- exchange-server - 有没有办法从 EWS URL 中识别交换服务器版本?