如何更简洁地实现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
相关产品推荐
相关产品推荐

