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

如何在Pandas中正确合并含NaN值的DataFrame行描述字符串?

解决Pandas DataFrame中分散description行与有效行合并的问题

示例数据构造

先构造包含两种场景的测试数据:有效行前有description行、有效行后有description行:

import pandas as pd
import numpy as np

data = {
    'description': ['前置描述:A类产品', np.nan, '后置描述:批量采购', '前置描述:B类配件', '补充说明:定制款', np.nan, '后置描述:加急订单'],
    'quantity': [np.nan, 50, np.nan, np.nan, np.nan, 20, np.nan],
    'value': [np.nan, 2500, np.nan, np.nan, np.nan, 800, np.nan]
}
df = pd.DataFrame(data)

原始DataFrame输出:

description  quantity   value
0        前置描述:A类产品       NaN     NaN
1                 NaN      50.0  2500.0
2        后置描述:批量采购       NaN     NaN
3        前置描述:B类配件       NaN     NaN
4        补充说明:定制款       NaN     NaN
5                 NaN      20.0   800.0
6        后置描述:加急订单       NaN     NaN

实现步骤

  1. 标记有效数据行
    先识别出quantity和value均不为空的有效行:

    df['is_valid'] = df[['quantity', 'value']].notna().all(axis=1)
    
  2. 为同属一个记录的行分配分组ID
    给每个有效行分配唯一ID,再通过双向填充,让有效行前后的description行继承同一个ID:

    # 仅给有效行分配递增ID,其余行设为NaN
    df['group_id'] = np.where(df['is_valid'], df['is_valid'].cumsum(), np.nan)
    # 双向填充,让前后的description行归到对应有效行的组
    df['group_id'] = df['group_id'].bfill().ffill()
    
  3. 分组聚合合并数据
    按分组ID聚合,合并同组的description,提取有效行的quantity和value:

    merged_df = df.groupby('group_id').agg(
        # 合并所有非空的description文本
        description=('description', lambda x: ' '.join(x.dropna().astype(str))),
        # 提取组内唯一的有效quantity值
        quantity=('quantity', lambda x: x.dropna().iloc[0]),
        # 提取组内唯一的有效value值
        value=('value', lambda x: x.dropna().iloc[0])
    ).reset_index(drop=True)
    

最终合并结果

description  quantity   value
0  前置描述:A类产品 后置描述:批量采购      50.0  2500.0
1  前置描述:B类配件 补充说明:定制款 后置描述:加急订单      20.0   800.0

关键说明

  • 不管description行在有效行前、后还是连续多行,都能被正确归到对应有效行的分组
  • 聚合时使用dropna()过滤空值,避免合并无效的NaN文本
  • 针对quantity和value的提取,因为每组只有一个有效行,所以用dropna().iloc[0]确保拿到唯一有效值

内容的提问来源于stack exchange,提问作者Jose M. González

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.07.20 15:38:27