在Pandas中筛选满足发起者收款条件的分组交易数据
解决外汇交易数据分组筛选问题
需求说明
我们需要从外汇交易数据中筛选出符合以下条件的交易组:向exchange发送USD的发起者,必须在同一transaction的to列中存在对应收款记录。不符合条件的交易组(发起者未收到对应款项的)需全部剔除。
原始数据
transaction from to currency 1 A exchange USD 1 exchange A Euro 1 B C Euro 2 C exchange USD 2 B D Euro 2 A G Euro 3 F exchange USD 3 D A Euro 3 B F Euro 4 R exchange USD 4 A D Euro 4 B Q Euro
实现步骤及代码
使用Pandas的groupby方法完成分组验证与筛选,具体代码如下:
import pandas as pd # 加载原始数据 data = { 'transaction': [1,1,1,2,2,2,3,3,3,4,4,4], 'from': ['A', 'exchange', 'B', 'C', 'B', 'A', 'F', 'D', 'B', 'R', 'A', 'B'], 'to': ['exchange', 'A', 'C', 'exchange', 'D', 'G', 'exchange', 'A', 'F', 'exchange', 'D', 'Q'], 'currency': ['USD', 'Euro', 'Euro', 'USD', 'Euro', 'Euro', 'USD', 'Euro', 'Euro', 'USD', 'Euro', 'Euro'] } df = pd.DataFrame(data) # 定义分组验证逻辑 def check_valid_group(group): # 提取当前组内向exchange发送USD的发起者 senders = group[(group['to'] == 'exchange') & (group['currency'] == 'USD')]['from'].tolist() # 获取当前组内所有收款方 all_recipients = group['to'].tolist() # 验证所有发起者都在收款方列表中 return all(sender in all_recipients for sender in senders) # 筛选符合条件的交易组 valid_transactions = df.groupby('transaction').filter(check_valid_group) # 输出结果 print(valid_transactions)
代码解释
- 数据加载:将原始交易数据转换为Pandas DataFrame格式,方便后续处理。
- 分组验证:针对每个交易组,先定位所有向exchange发送USD的发起者,再检查这些发起者是否都出现在该组的收款方(to列)中。
- 筛选合并:通过
groupby.filter()直接保留验证通过的分组,自动合并为最终的结果DataFrame。
最终结果
运行代码后得到的符合要求的DataFrame如下:
transaction from to currency 0 A exchange USD 1 exchange A Euro 6 F exchange USD 8 B F Euro
内容的提问来源于stack exchange,提问作者Olive
相关产品推荐
相关产品推荐

