首页 > 解决方案 > 从一个数据框的列中获取唯一值并使用它来过滤另一个数据框中的行

问题描述

我希望使用 df1 中的一列作为 df2 上的过滤器:

df1 = [('Client', ['A', 'A', 'A', 'B', 'C', 'D', 'D',]),
                    ('Num_Trades', ['1', '2', '3', '1', '1', '1', '1',])
      ]

df1 = pd.DataFrame.from_items(df1)
display(df1)

    Client  Num_Trades
0   A       1
1   A       2
2   A       3
3   B       1
4   C       1
5   D       1
6   D       1

现在从 df1 中提取唯一客户端:

mask_array = df1.Client.unique()
mask_array = dataframe=pd.DataFrame(mask_array, columns=['Client']) 
# mask_list = df1['Client'].unique().tolist()
# mask_list = dataframe=pd.DataFrame(mask_list, columns=['Client']) 
display(mask_array)

    Client
0   A
1   B
2   C
3   D

要过滤的示例数据框:

df2 = [('Client', ['A', 'B', 'A', 'Y',]),
('Product', ['GOVT', 'GOVT', 'GOVT', 'GOVT',]),
('currency_str', ['USD', 'GBP', 'USD', 'NZD',]),
('Amount', ['10', '20', '30', '40',]),
         ]
# create pandas df
df2 = pd.DataFrame.from_items(df2)
display(df2)


        Client  Product currency_str    Amount
0       A       GOVT    USD             10
1       B       GOVT    GBP             20
2       A       GOVT    USD             30
3       Y       GOVT    NZD             40

所需的结果只是对df1中客户端存在的Amount的所有行求和:

Client  Product currency_str    Amount
A       GOVT    USD             40
B       GOVT    GBP             20

我的代码正在生成“DataFrame”对象是可变的,因此它们不能被散列。我也尝试使用数组和列表。那么需要对唯一的记录集做些什么,以便它们可以用作 df2 的过滤器呢?

d = [ 
        ('Amount', 'sum')     
    ] 

# aggregate 
mask = df2['Client'].str.contains(mask_list) 
df2 = df2[mask].groupby(['Client','Product','currency_str'])['Amount'].agg(d).reset_index()
display(df2)

标签: pythonpandasdataframepandas-groupby

解决方案


如果需要按子字符串过滤,您可以使用joinwith|正则表达式:OR

mask = df2['Client'].str.contains('|'.join(df1.Client.unique()))

或者isin如果想要按值过滤,请使用:

mask = df2['Client'].isin(df1.Client.unique())

df2['Amount'] = df2['Amount'].astype(int)
df2 = df2[mask].groupby(['Client','Product','currency_str'])['Amount'].agg(d).reset_index()
print(df2)
  Client Product currency_str  Amount
0      A    GOVT          USD      40
1      B    GOVT          GBP      20

推荐阅读