如何在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
实现步骤
标记有效数据行
先识别出quantity和value均不为空的有效行:df['is_valid'] = df[['quantity', 'value']].notna().all(axis=1)为同属一个记录的行分配分组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()分组聚合合并数据
按分组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
相关产品推荐
相关产品推荐

