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

基于条件合并Pandas DataFrame两列的Python实现问题

Pandas按条件生成新列遇None/NaN问题修复

现有如下Pandas DataFrame,需基于以下规则生成新列:

  • 当y值为'-1'时,取x的值
  • 当x值为'-1'时,取y的值

原始DataFrame:

import pandas as pd

df = pd.DataFrame({'x': ['day', 'day', 'night', '-1', '-1', '-1'],
                   'y': ['-1', '-1', '-1', 'night', 'day', 'day']})

你尝试的两种方法出现None/NaN的核心原因:判断条件用了整数-1,但DataFrame中存储的是字符串'-1',导致条件完全不匹配。以下是修正后的解决方案:

方法一:修正apply函数的判断逻辑

将判断中的整数-1改为字符串'-1',同时补充默认返回避免无匹配时返回None:

def func(row):
    if row['y'] == '-1':
        return row['x']
    elif row['x'] == '-1':
        return row['y']
    return None

df['z'] = df.apply(func, axis=1)

方法二:修正np.select的条件表达式

同样将条件中的-1替换为字符串'-1':

import numpy as np

conditions = [
    (df['y'] == '-1'),
    (df['x'] == '-1'),
]
choices = [df['x'], df['y']]
df['z1'] = np.select(conditions, choices, default=np.nan)

更简洁的替代方案

利用Pandas内置方法简化逻辑,比如combine_first:

df['z'] = df['x'].replace('-1', np.nan).combine_first(df['y'].replace('-1', np.nan))

或者使用where链式判断:

df['z'] = df['x'].where(df['y'] == '-1', df['y'].where(df['x'] == '-1'))

最终得到符合预期的结果:

# 输出结果
print(df)
#       x     y      z
# 0   day   -1    day
# 1   day   -1    day
# 2 night   -1  night
# 3   -1 night  night
# 4   -1   day    day
# 5   -1   day    day

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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.08.08 15:00:51