我希望使用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
我的代码生成的'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)
答案 0 :(得分:2)
如果需要按子字符串过滤,则可以将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
答案 1 :(得分:1)
这对我有用。我注意到数量实际上是一个字符串,因此需要在groupby之前进行理想的转换。如果您不能在这里转换我的解决方案:
创建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
NB:
apply(lambda x: sum([np.int(x) for x in x.values]))
执行以下操作。列数量中的每个值都通过np.int转换为int并保存在列表中。然后在该列表上求和。例: 对于客户A:groupby返回了金额“ 10”和“ 30”,但您不能对字符串求和。因此,请单独进行转换,然后应用sum()。
添加:
.to_frame('Amount').reset_index()
Client Product currency_str Amount
0 A GOVT USD 40
1 B GOVT GBP 20