如何在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
相关产品推荐
相关产品推荐

