如何基于行索引将DataFrame多列合并至指定列?
问题解决:Pandas基于行索引合并多列并处理NaN值
问题分析
你要实现的是:针对msg为msg0或msg2的行,把d0、d1、d2的内容合并到d0列,同时把d1、d2设为缺失值,但当前代码存在两个关键问题:
- 直接拼接含
np.nan的字符串列时,np.nan会导致整个拼接结果变成np.nan(比如示例中第2行的d2是np.nan,直接相加会让d0变成nan) - 你的
mask逻辑错误:目标是处理msg0和msg2,但代码里写的是msg0、msg1、msg3,完全不符合需求
解决方案
步骤1:正确构建筛选掩码
用isin方法更简洁准确地选中目标行:
mask = df['msg'].isin(['msg0', 'msg2'])
步骤2:安全合并多列(处理NaN)
先把列中的np.nan替换为空字符串,再进行拼接,避免出现全NaN的情况:
# 合并d0/d1/d2列,NaN替换为空字符串 merged_vals = df[['d0', 'd1', 'd2']].fillna('').sum(axis=1)
或者用apply逐行拼接(效果一致,适合复杂拼接逻辑):
merged_vals = df[['d0', 'd1', 'd2']].apply(lambda x: ''.join(x.fillna('')), axis=1)
步骤3:更新DataFrame
将合并后的值赋值给d0列的目标行,同时把d1、d2设为真正的缺失值(注意不要用字符串"NaN",要用np.nan):
df.loc[mask, 'd0'] = merged_vals[mask] df.loc[mask, ['d1', 'd2']] = np.nan
完整代码
import pandas as pd import numpy as np df = pd.DataFrame({'time': ['0', '1', '2', '3'], 'msg': ['msg0', 'msg1', 'msg0', 'msg2'], 'd0': ['a', 'x', 'a', '1'], 'd1': ['b', 'x', 'b', '2'], 'd2': ['c', 'x', np.nan, '3']}) # 筛选需要处理的行 mask = df['msg'].isin(['msg0', 'msg2']) # 合并列并处理NaN merged_vals = df[['d0', 'd1', 'd2']].fillna('').sum(axis=1) # 更新数据 df.loc[mask, 'd0'] = merged_vals[mask] df.loc[mask, ['d1', 'd2']] = np.nan print(df)
运行结果
time msg d0 d1 d2 0 0 msg0 abc NaN NaN 1 1 msg1 x x x 2 2 msg0 ab NaN NaN 3 3 msg2 123 NaN NaN
额外优化建议
如果你的列是从d0开始的连续列,可以用切片代替列名列表,比如df.loc[:, 'd0':'d2'],这样即使列数增加也不用修改代码:
merged_vals = df.loc[:, 'd0':'d2'].fillna('').sum(axis=1)
内容的提问来源于stack exchange,提问作者Jesse T-P
相关产品推荐
相关产品推荐

