我在 pandas 中有一个主数据集
usa_df
,看起来像这样
usa_df = {
"state_name": ["Alabama", "Alabama", "Alaska", "Alaska", "Arkansas"],
"persons": [1, 2, 1, 1, 1],
"day_week": ["monday", "monday", "tuesday", "monday", "tuesday"]
}
数据集中大约有 20 万行,每个州名称出现数千行。每一行都是记录的犯罪,州名、人物和星期几是大约一百个数据点中的数据点)。
我有一个代码可以过滤特定州的 state_name 列,然后将其导出为 csv
state_df = usa_df[usa_df.state_name == "Alabama"]
state_df.reset_index(drop=True)
os.chdir("/path/to/file")
state_df.to_csv("./Alabama.csv", index=False)
这个方法工作得很好,但我正在尝试找到一种方法,可以自动为每个状态创建一个文件,而不必这样做五十次。
作为新人,除了将状态列表设置为
list[str]
之外,我不知道如何从这里继续,但除此之外我迷失了。是否可以为匹配特定状态的每一行自动创建所有 50 个文件?感谢您的帮助!
一个快速而简单的解决方案是对所有唯一的状态名称使用
for
循环。您可以从数据框本身获取它们:
import pandas as pd
usa_df = {
"state_name": ["Alabama", "Alabama", "Alaska", "Alaska", "Arkansas"],
"persons": [1, 2, 1, 1, 1],
"day_week": ["monday", "monday", "tuesday", "monday", "tuesday"]
}
usa_df = pd.DataFrame(usa_df)
for current_name in sorted(set(usa_df.state_name)):
state_df = usa_df[usa_df.state_name == current_name]
state_df.to_csv(f"/path/to/file/{current_name}.csv", index=False)
正如 @mozway 的评论中指出的,更有效的解决方案是使用分组,以免多次过滤数据帧:
import pandas as pd
usa_df = {
"state_name": ["Alabama", "Alabama", "Alaska", "Alaska", "Arkansas"],
"persons": [1, 2, 1, 1, 1],
"day_week": ["monday", "monday", "tuesday", "monday", "tuesday"]
}
usa_df = pd.DataFrame(usa_df)
for current_name, current_group in usa_df.groupby("state_name"):
current_group.to_csv(f"/path/to/file/{current_name}.csv", index=False)
另请注意:
index=False
进行保存。to_csv()
方法的完整路径,而不是更改当前工作目录。