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

如何基于行索引将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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.08.12 08:35:34