pandas中如何根据指定列值合并DataFrame对应行内容
按时间列合并文本列的实现方案
问题复现
现有如下结构的DataFrame:
time text 01.01.1970 abc 01.01.1970 cde 01.01.1970 fgh 01.01.1980 abc 01.01.1980 xyz
需求为按time列分组,将同组下text列的内容用\n作为分隔符合并,期望得到的输出结构如下:
time text 01.01.1970 abc\ncde\nfgh 01.01.1980 abc\nxyz
使用如下代码尝试实现时未得到预期结果,text列每行都返回text\ntime的内容:
out = (df.groupby('time', as_index=False) ['text'].agg(lambda x: '\n'.join(x.dropna())))
异常原因
该问题是部分pandas版本的兼容bug导致:groupby后使用单括号选取单列+as_index=False的组合写法时,聚合函数没有正确接收到text列的内容,反而把整个DataFrame的列名作为迭代对象传入,最终输出了拼接列名的错误结果。
修复方法
两种可直接运行的正确写法:
- 写法1:将选列的单括号改为双括号,明确传入要聚合的单列DataFrame,避免列识别错误
out = (df.groupby('time', as_index=False) [['text']].agg(lambda x: '\n'.join(x.dropna())))
- 写法2:用
apply实现聚合后重置索引,兼容性更强,不受版本差异影响
out = df.groupby('time')['text'].apply(lambda x: '\n'.join(x.dropna())).reset_index()
以上两种写法运行后都可以得到预期的合并结果。
内容的提问来源于stack exchange,提问作者Tobitor
相关产品推荐
相关产品推荐

