在熊猫的for循环中过滤掉多个数据帧的行

时间:2021-05-13 11:03:59

标签: python pandas dataframe

我有一个包含 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,并使用名称字典进行过滤。但是,我似乎无法适应循环中数据帧的过滤。有人可以帮我解决吗?

2 个答案:

答案 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}
相关问题