如何修改Python代码仅拼接连续相同name和day行的text字段?
问题描述
现有数据集:
name day text john 1 october hello john 1 october world mary 1 october good friend john 1 october python is cool peter 1 october love is peter 1 october in the air
需求:仅将连续行中name和day字段均相同的text字段拼接,非连续的相同name+day组合不合并。期望输出:
name day text john 1 october hello world mary 1 october good friend john 1 october python is cool peter 1 october love is in the air
当前使用代码:
data = data.fillna(' ') data = data.groupby(['name', 'day'], as_index=False).agg({'text': ' '.join})
但该代码会将同一name+day的所有text全量拼接,不符合需求,得到错误结果:
name day text john 1 october hello world python is cool mary 1 october good friend peter 1 october love is in the air
解决方案
核心思路是先标记出连续相同的name+day分组,再针对这些分组进行拼接,而非直接按name+day全局分组。
修改后的代码如下:
import pandas as pd # 填充空值 data = data.fillna(' ') # 创建分组标识:当name或day与前一行不同时,分组号+1 data['group_id'] = (data[['name', 'day']] != data[['name', 'day']].shift()).any(axis=1).cumsum() # 按group_id分组拼接text,保留name和day result = data.groupby('group_id', as_index=False).agg({ 'name': 'first', 'day': 'first', 'text': ' '.join }).drop(columns='group_id')
代码解释
- 创建分组标识:通过
shift()对比当前行与前一行的name和day,只要有一个字段不同,就生成一个新的分组号,确保连续相同的name+day行归为同一组。 - 分组拼接:按生成的
group_id分组,取每组的第一个name和day,拼接组内的text,最后删除临时的group_id字段,得到目标结果。
该方法采用Pandas向量化运算,效率较高,适合处理大规模数据集。
内容的提问来源于stack exchange,提问作者MG Fern
相关产品推荐
相关产品推荐

