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

如何使用Pandas将两列合并为一列并排除NaN值?

解决方法:用Pandas合并两列并替换NaN

嘿,这个需求用Pandas的内置方法就能轻松实现,我给你两个实用的方案,都能完美匹配你的需求:

方案一:使用combine_first(最直观的方法)

combine_first方法的作用就是:优先保留当前列的非NaN值,当当前列是NaN时,用另一列对应位置的值填充,完全符合你要的“用相邻列的值替换任意一列中的NaN”的逻辑。

代码示例

首先构造你的示例DataFrame:

import pandas as pd
import numpy as np

# 构造示例数据
data = {
    'Gains': [np.nan, np.nan, np.nan, np.nan, np.nan, np.nan, 1.06, np.nan, np.nan, 0.14],
    'Loss': [np.nan, -0.17, -0.13, -0.75, -0.17, -0.99, np.nan, -1.29, -0.42, np.nan]
}
both = pd.DataFrame(data)

然后执行填充并生成新的DataFrame:

# 用Loss列填充Gains的NaN,再转为单列DataFrame
change_df = both['Gains'].combine_first(both['Loss']).to_frame('Change')

执行后change_df的结果就是你想要的:

Change
0     NaN
1   -0.17
2   -0.13
3   -0.75
4   -0.17
5   -0.99
6    1.06
7   -1.29
8   -0.42
9    0.14

方案二:使用行方向填充(灵活通用)

如果你需要更通用的处理(比如以后列数更多的情况),可以用bfill或ffill按行方向填充,再提取第一列:

代码示例

# 按行方向向后填充NaN,然后取第一列转为单列DataFrame
change_df = both.bfill(axis=1).iloc[:, 0].to_frame('Change')

解释

  • bfill(axis=1):沿着行的方向,用右侧列的非NaN值填充左侧的NaN;
  • iloc[:, 0]:提取填充后的第一列(也就是每行第一个非NaN的值);
  • to_frame('Change'):把Series转为你需要的单列DataFrame。

如果你的行中存在多列非NaN值,这个方法会优先保留最左侧的非NaN值,和方案一的效果一致。


内容的提问来源于stack exchange,提问作者Rahel Miz

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.05.06 15:52:41