我有一个包含 3 个数据框的列表,其中包含各种名称和数字:
dfs = [df1, df2, df3]
df1 example:
| Names | Number |
|-------|--------|
| Cat | 45 |
| Bat | 1 |
| Dog | 78 |
| Goat | 45 |
df2 example:
| Names | Number |
|-------|--------|
| Pizza | 2 |
| Bagel | 17 |
| Pasta | 3 |
| Bread | 88 |
df3 example:
| Names | Number |
|-----------|--------|
| Rose | 6 |
| Sunflower | 3 |
| Tulip | 6 |
我还有一个每个数据框的名称列表和存储为变量的基础名称:
object_types = ['animals', 'food', 'plants']
selected_names = {'animals': ['Cat', 'Bat'], 'food': ['Pizza', 'Apple'], 'plants': ['Rose']}
我最终想要的是一个以类型为键、以数据框为值的字典。例如
filtered_dfs= {'animals': df1, ....}
其中单个数据框仅包含在 names
变量中具有与其类型匹配的条目的行(因此只有 'Cat' 和 'Bat' 的行保留在 df1 中)
我正在考虑做以下事情:
filtered_dfs={}
for objecttype, df, selectedname in zip(object_types, dfs, selected_names):
filtered_dfs[objecttype] = df
for i in selectedname[objecttype]:
df[df['Names'].isin(i)]
我想在字典中将类型和数据帧分配为 k,v 对,然后根据类型访问每个 df,并使用名称字典进行过滤。但是,我似乎无法适应循环中数据帧的过滤。有人可以帮我解决吗?
答案 0 :(得分:1)
这是您要找的吗?:
object_types = ['animals', 'food', 'plants']
selected_names = {'animals': ['Cat', 'Bat'], 'food': ['Pizza', 'Apple'], 'plants': ['Rose']}
dfs = [df1, df2, df3]
filtered_dfs = {}
for df, obj_type in zip(dfs, object_types):
i = selected_names[obj_type]
new_df = df[df['Names'].isin(i)]
filtered_dfs[obj_type] = new_df
答案 1 :(得分:0)
您可以按如下方式简化代码:
filtered_dfs={}
for name in names.keys():
for df in dfs:
if any(df['Names'].isin(names[name])):
filtered_dfs[name] = df
此逻辑不假设 dict 键序列与数据帧类型(无论是“动物”、“食物”还是“植物”类型)序列同步。也就是说,不要求 df1
必须是 animals
类型(可以是 df2
类型的 animals
并且仍然可以正确提取)。这个逻辑应该更通用。
结果:
print(filtered_dfs)
{'animals': Names Number
0 Cat 45
1 Bat 1
2 Dog 78
3 Goat 45,
'food': Names Number
0 Pizza 2
1 Bagel 17
2 Pasta 3
3 Bread 88,
'plants': Names Number
0 Rose 6
1 Sunflower 3
2 Tulip 6}