将相同操作有效地应用于多个DataFrame

时间:2019-05-23 17:56:01

标签: python pandas loops dataframe

我有两个具有相同列和相似内容的数据框。

我想在每个应用相同的功能,而不必强行使用它们或连接dfs。我试图将这些对象传递给嵌套字典,但这似乎比它的价值还要麻烦(我不相信dataframe.to_dict支持传递到现有列表中)。

但是,似乎for循环将dfs列表存储在df对象中,而且我不知道如何将其恢复为原始dfs ...请参见下面的示例。

df1 = {'Column1': [1,2,2,4,5],
        'Column2': ["A","B","B","D","E"]}
df1 = pd.DataFrame(df1, columns=['Column1','Column2'])

df2 = {'Column1': [2,11,2,2,14],
         'Column2': ["B","Y","B","B","V"]}
df2 = pd.DataFrame(df2, columns=['Column1','Column2'])


def filter_fun(df1, df2):
    for df in (df1, df2):
        df = df[(df['Column1']==2) & (df['Column2'].isin(['B']))]
    return df1, df2

filter_fun(df1, df2)

2 个答案:

答案 0 :(得分:2)

如果您将过滤器作为函数编写,则可以将其应用于列表推导中:

def filter(df):
    return df[(df['Column1']==2) & (df['Column2'].isin(['B']))]


df1, df2 = [filter(df) for df in (df1, df2)]

答案 1 :(得分:1)

我建议使用自定义的keys进行串联,因为1)很容易将其分配回来,并且2)您可以一次执行相同的操作,而不必执行两次。

# Concatenate df1 and df2
df = pd.concat([df1, df2], keys=['a', 'b'])
# Perform your operation
out = df[(df['Column1'] == 2) & df['Column2'].isin(['B'])]

out.loc['a'] # result for `df1`

   Column1 Column2
1        2       B
2        2       B

out.loc['b'] # result for `df2`

   Column1 Column2
0        2       B
2        2       B
3        2       B

这对于大多数操作应该可以正常工作。对于groupby,您还将希望在第0 个索引级别进行分组。