基于transaction_hash分组筛选ETH与stETH交易对的问题排查
排查ETH/stETH转账DataFrame分组筛选后重复行异常原因
业务背景与异常表现
业务需求:基于包含ETH、stETH转账记录的DataFrame,按
transaction_hash分组;当组内stETH存在多个唯一金额时,筛选出与同组ETH金额最接近的交易对,生成目标DataFrame。
异常现象:处理后未移除无关行,反而新增重复行。
核心排查方向
分组后关联逻辑错误
若代码中先提取ETH金额,再与原DataFrame做无筛选的全量关联,会导致同一交易哈希下的ETH行与所有stETH行匹配,生成大量重复行。例如:# 错误示例:全量关联引发重复 eth_amt_df = df[df['token'] == 'ETH'].groupby('transaction_hash')['amount'].first().reset_index() # 未筛选最接近的stETH,直接全量合并 result = df.merge(eth_amt_df, on='transaction_hash', suffixes=('', '_eth'))未精准筛选"最接近"的stETH行
计算金额差值后,未按transaction_hash取差值最小的唯一行,而是保留了所有行,或因排序/分组操作未去重导致重复。例如:# 错误示例:未去重导致重复保留 df['diff'] = abs(df['amount'] - df.groupby('transaction_hash')['amount'].transform( lambda x: x[df['token'] == 'ETH'].iloc[0] if len(x[df['token'] == 'ETH'])>0 else None )) # 仅排序未去重,同一组内多行会被保留 result = df.sort_values('diff').groupby('transaction_hash').head(1)若组内存在多个差值相同的stETH行,
head(1)不会自动去重,若原始数据已有重复,会进一步放大重复数量。原始数据存在重复行
分组处理前,原始DataFrame中已存在transaction_hash+token+amount完全重复的记录,分组筛选时未先去重,导致处理后重复行被保留甚至叠加。分组操作的索引冲突
使用groupby.apply()返回子DataFrame时,若未重置索引,会生成多层级索引;后续与ETH行合并时,索引重复会引发重复行。例如:# 错误示例:apply返回多层索引引发重复 def process_group(g): eth_amt = g[g['token'] == 'ETH']['amount'].iloc[0] steth_sub = g[g['token'] == 'stETH'].copy() steth_sub['diff'] = abs(steth_sub['amount'] - eth_amt) return steth_sub[steth_sub['diff'] == steth_sub['diff'].min()] result = df.groupby('transaction_hash').apply(process_group) # 此时result为多层索引,若直接合并ETH行,会因索引重复生成重复行浮点金额精度问题
ETH/stETH金额为浮点型,精度误差可能导致多个stETH金额与ETH金额的差值完全相同(如1e-18级误差),筛选时会将这些行全部保留,表现为"重复行"。
内容的提问来源于stack exchange,提问作者Olive
相关产品推荐
相关产品推荐

