You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

基于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

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.08.02 15:41:47