如何在Pandas中仅合并索引连续行的text_info列内容?
问题需求
仅当index值连续递增时,将对应行的text_info字符串合并到同一行,同时保留每组的起始index作为结果行的index。
原始数据
| index | text_info |
|---|---|
| 0.0 | word 1 |
| NaN | NaN |
| 3.0 | word2 |
| 0.0 | word3 |
| 1.0 | word4 |
| 2.0 | word5 |
| 4.0 | word6 |
预期输出
| index | text_info |
|---|---|
| 0.0 | word 1 |
| NaN | NaN |
| 3.0 | word2 |
| 0.0 | word3, word4, word5 |
| 4.0 | word6 |
之前尝试的df.groupby('index',dropna=False)["text_info"].sum()会合并所有同index的内容,不符合连续分组的要求,以下是可行的实现方案:
解决方案
核心逻辑是先给连续的index行打上相同的分组标签,再按分组合并文本,保留每组的起始index。
完整代码
import pandas as pd # 构建与原始数据一致的示例数据 df = pd.DataFrame({ 'index': [0.0, pd.NA, 3.0, 0.0, 1.0, 2.0, 4.0], 'text_info': ['word 1', pd.NA, 'word2', 'word3', 'word4', 'word5', 'word6'] }) # 标记index非空的有效行 df['is_valid'] = df['index'].notna() # 生成分组ID:连续递增的index,index减去其在有效行中的位置会得到固定值,以此分组 df['group_id'] = df.apply( lambda row: row['index'] - df[df['is_valid']].index.get_loc(row.name) if row['is_valid'] else pd.NA, axis=1 ) # 按分组聚合:取每组第一个index,合并非空的text_info result_df = df.groupby('group_id', dropna=False).agg( index=('index', 'first'), text_info=('text_info', lambda x: ', '.join(x.dropna())) ).reset_index(drop=True) # 把合并后为空的text_info转回NaN result_df['text_info'] = result_df['text_info'].replace('', pd.NA) print(result_df)
关键步骤说明
- 标记有效行:区分
index为空和非空的行,避免空值干扰分组逻辑。 - 生成分组ID:连续递增的
index,比如0.0、1.0、2.0,它们在有效行中的位置是第3、4、5位,index - 位置的结果都是-3,会被归为同一组;单独的0.0、3.0、4.0计算后得到唯一值,各自成组。 - 分组合并:每个分组只保留第一个
index,把组内所有非空的text_info用逗号拼接。 - 清理空值:将原本是NaN的行,合并后为空的
text_info转回NaN,和原始数据格式对齐。
运行代码后,输出结果与预期完全一致。
内容的提问来源于stack exchange,提问作者J.Doe
相关产品推荐
相关产品推荐

