从一个数据帧的列中获取唯一值,并使用它来筛选另一个数据框中的行



我希望在 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 中提取 uniquie 客户端:

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 中客户端所在的金额上求和的所有行:

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

我的代码正在生成"数据帧"对象是可变的,因此无法对其进行哈希处理。我也尝试使用数组和列表。那么,需要对唯一的记录集执行哪些操作,以便它们可以用作 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)

如果需要按子字符串过滤,您可以将join与正则表达式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

这对我有用。我注意到金额实际上是一个字符串,因此需要在分组之前理想地转换它。如果您无法在此处转换我的解决方案:

创建 df1 的唯一客户端列表:

df1['Client'].unique()
array(['A', 'B', 'C', '

d'], dtype=object(

然后使用它在客户端列上过滤 df2

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

现在添加 groupby 和 lambda 来处理字符串数量:

df2[
df2['Client'].isin(df1['Client'].unique())
].groupby(['Client','Product','currency_str'])['Amount'].apply(lambda x: sum([np.int(x) for x in x.values]))
Client  Product  currency_str
A       GOVT     USD             40
B       GOVT     GBP             20
Name: Amount, dtype: int64

铌:

apply(lambda x: sum([np.int(x) for x in x.values]))

执行以下操作。列金额中的每个值都通过 np.int 转换为 int 并保存在列表中。然后在该清单上完成一笔款项。例: 对于客户端 A:金额"10"和"30"由 groupby 返回,但不能对字符串求和。因此,单独转换,然后应用 sum((。

加:

.to_frame('Amount').reset_index()

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

最新更新