基于条件合并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
相关产品推荐
相关产品推荐

