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

如何在Pandas分组聚合时避免重复拼接交易所名称?

问题描述

现有如下结构的Pandas DataFrame:

asks_price  asks_qty exchange_name_ask     bids_price  bids_qty exchange_name_bid
0      20156.51  0.000745          Coinbase      20153.28  0.000200          Coinbase
1      20157.52  0.050000          Coinbase      20152.27  0.051000          Coinbase
2      20158.52  0.000745          Coinbase      20151.28  0.000200          Kraken
3      20158.52  0.050000          FTX           20151.28  0.051000          Coinbase

需求:按asks_price和bids_price分组,对asks_qty、bids_qty求和,同时拼接exchange_name_ask、exchange_name_bid字段的交易所名称,且避免出现同名重复拼接(比如不要CoinbaseCoinbase这类结果)。

当前使用df.groupby(['asks_price', 'bids_price']).sum(False)可实现数值求和,但字符串字段会直接重复拼接,无法去重。

解决方案

通过groupby.agg()为不同字段指定单独聚合逻辑:数值字段求和,字符串字段去重后拼接。

方法1:自定义聚合函数

先定义一个去重拼接的函数,再针对字符串字段调用:

import pandas as pd

# 定义去重拼接函数
def join_unique(x):
    return ','.join(pd.unique(x))

# 分组聚合
result = df.groupby(['asks_price', 'bids_price']).agg(
    asks_qty='sum',
    bids_qty='sum',
    exchange_name_ask=join_unique,
    exchange_name_bid=join_unique
).reset_index()

方法2:用lambda表达式简化

无需单独定义函数,直接用lambda结合pd.unique实现:

result = df.groupby(['asks_price', 'bids_price']).agg(
    asks_qty='sum',
    bids_qty='sum',
    exchange_name_ask=lambda x: ','.join(pd.unique(x)),
    exchange_name_bid=lambda x: ','.join(pd.unique(x))
).reset_index()

最终结果示例

执行后得到的目标结果如下:

asks_price  bids_price  asks_qty  bids_qty exchange_name_ask exchange_name_bid
0      20156.51    20153.28  0.000745   0.00020          Coinbase          Coinbase
1      20157.52    20152.27  0.050000   0.05100          Coinbase          Coinbase
2      20158.52    20151.28  0.050745   0.05120       Coinbase,FTX       Kraken,Coinbase

可见字符串字段的同名交易所仅保留一次,避免了重复拼接问题。

内容的提问来源于stack exchange,提问作者Nathan

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.08.18 10:01:18