使用pandas GroupBy按多列聚合字符串列的实现方法
Solution
你只需要把分组键改成包含vid和sente的列表,同时明确指定要聚合的列(避免对分组键本身做操作),就能得到想要的结果。
完整代码示例
import pandas as pd # 先构造你的原始DataFrame(如果已经有了可以跳过这步) df = pd.DataFrame({ 'vid': [1,2,3,3,1,1,1,2,3], 'pos': ['a','b','b','a','d','a','a','b','a'], 'value': ['A','B','A','A','B','C','D','A','A'], 'sente': [21,21,21,21,22,22,22,22,22] }) # 核心操作:按vid+sente分组,对pos和value列做空格连接 df2 = df.groupby(['vid', 'sente']).agg({ 'pos': lambda x: ' '.join(x), 'value': lambda x: ' '.join(x) }).reset_index() # 调整列顺序和你的目标结果一致 df2 = df2[['vid', 'pos', 'value', 'sente']] print(df2)
输出结果
vid pos value sente 0 1 a A 21 1 1 d a a B C D 22 2 2 b B 21 3 2 b A 22 4 3 b a A A 21 5 3 a A 22
关键说明
- 分组键改为列表:
groupby(['vid', 'sente'])会同时按照这两列的组合值进行分组,确保只有sente和vid都相同的行才会被合并。 - 指定聚合列:在
agg中传入字典,明确告诉Pandas哪些列需要执行join操作,这样分组键(vid和sente)会被保留,不会被修改。 - 重置索引:
reset_index()把分组键从索引变回普通列,恢复你想要的DataFrame结构。
你之前的代码只按sente分组,而且没有指定聚合列,会对所有列执行join,这显然不符合需求。调整后就完美匹配你的目标结果啦。
内容的提问来源于stack exchange,提问作者Mi.
相关产品推荐
相关产品推荐

