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

如何更简洁地实现DataFrame分组后多列值的拼接?

问题:GroupBy后按指定规则拼接多列值

需求:对DataFrame执行groupby操作后,按规则拼接多列值——列内值用:分隔,记录间用#分隔。

原始DataFrame:

type1 type2 id score
A      B    123  78
A      B    124  89
A      C    126  45
A      C    231  98
A      C    657  92

期望结果:

type1 type2 result
A      B    123:78#124:89
A      C    126:45#231:98#657:92

现有实现(较为复杂):

g=df.groupby(['type1','type2'])
final=pd.DataFrame(columns=['type1','type2','result'])
for i,j in g:
    j['total']=j.apply(lambda x:x['id']+':'+str(x['score']),axis=1)
    final.loc[len(final)]=[item for item in i]+['#'.join(j['total'])]

请问是否有更简洁的实现方式?


简洁实现方案

当然有,推荐两种更高效简洁的写法:

方式一:分步构造+聚合(可读性优)

先为每行生成id:score格式的字符串,再分组聚合拼接:

# 先将id转为字符串,与score拼接成每行的组合字符串
df['combined'] = df['id'].astype(str) + ':' + df['score'].astype(str)
# 分组后用#拼接每组的combined值,重置索引得到目标结构
result = df.groupby(['type1', 'type2'])['combined'].agg('#'.join).reset_index(name='result')

方式二:分组内直接处理(代码更紧凑)

利用groupby.apply在分组内完成所有拼接逻辑:

result = df.groupby(['type1', 'type2']).apply(
    lambda group: '#'.join(group['id'].astype(str) + ':' + group['score'].astype(str))
).reset_index(name='result')

优势说明

这两种写法都避免了手动循环和逐行构建DataFrame,完全利用pandas内置的向量化操作和聚合函数,代码更简洁,同时性能也优于原实现(尤其是数据量较大时)。

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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.08.20 00:35:33