Python实现DataFrame同类别行合并及聚合需求求助
解决Pandas分组拼接非空值的问题
嘿,刚接触Python和Pandas的话,这种分组处理的需求确实容易卡壳,不过别担心,咱们一步步来搞定它!
首先先确认下你的原始数据:
import pandas as pd data = pd.DataFrame({'a': [1,1,2,2,2,3], 'b': [12,22,23,34,44,55], 'c':['a','','','','c',''], 'd':['','b','b','a','a','']})
要实现按列a分组,忽略b,把同组内c、d的非空值拼接起来,这里给你两种简洁高效的实现思路:
方法一:自定义拼接函数(可读性强)
先写一个小函数,专门用来把一列里的非空值拼接成字符串:
def concat_non_empty(series): # 过滤空字符串,再把剩下的非空值连起来 return ''.join([val for val in series if val != ''])
然后通过groupby分组后,对c和d列应用这个函数:
result = data.groupby('a')[['c', 'd']].agg(concat_non_empty).reset_index()
运行后就能得到你想要的结果:
a c d 0 1 a b 1 2 c baa 2 3 ''
方法二:匿名函数写法(更紧凑)
不用单独定义函数,直接在agg里用匿名函数实现,代码更简洁:
result = data.groupby('a')[['c', 'd']].agg(lambda x: ''.join(x[x != ''])).reset_index()
这个写法和方法一效果完全一致,适合快速实现需求。
关键逻辑拆解
groupby('a'):按a列的取值把数据分成独立分组[['c', 'd']]:只指定处理c、d两列,自动忽略了不需要的b列,完美匹配你的要求agg(...):对每个分组的目标列执行拼接操作——先通过布尔索引过滤掉空字符串,再用''.join()把非空值按顺序拼接reset_index():把分组用的a列从索引变回普通列,让结果结构和你给出的示例完全一致
内容的提问来源于stack exchange,提问作者KANIN SRIJUNDORN
相关产品推荐
相关产品推荐

