You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

如何在Pandas中仅合并索引连续行的text_info列内容?

问题需求

仅当index值连续递增时,将对应行的text_info字符串合并到同一行,同时保留每组的起始index作为结果行的index。

原始数据

indextext_info
0.0word 1
NaNNaN
3.0word2
0.0word3
1.0word4
2.0word5
4.0word6

预期输出

indextext_info
0.0word 1
NaNNaN
3.0word2
0.0word3, word4, word5
4.0word6

之前尝试的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)

关键步骤说明

  1. 标记有效行:区分index为空和非空的行,避免空值干扰分组逻辑。
  2. 生成分组ID:连续递增的index,比如0.0、1.0、2.0,它们在有效行中的位置是第3、4、5位,index - 位置的结果都是-3,会被归为同一组;单独的0.0、3.0、4.0计算后得到唯一值,各自成组。
  3. 分组合并:每个分组只保留第一个index,把组内所有非空的text_info用逗号拼接。
  4. 清理空值:将原本是NaN的行,合并后为空的text_info转回NaN,和原始数据格式对齐。

运行代码后,输出结果与预期完全一致。

内容的提问来源于stack exchange,提问作者J.Doe

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.07.25 05:15:29