python - 根据其他列的 if-else 填充 pandas DataFrame 的新列

标签 python pandas numpy dataframe

我有一种情况,我想在 Pandas DataFrame 中创建一个新列,并根据涉及其他 2 个列的条件填充它。在这个例子中:

import pandas as pd
import numpy as np

df = pd.DataFrame(np.array([['value1','value2'],['value',np.NaN],[np.NaN,np.NaN]]), columns=['col1','col2'])

我想创建一个新列“new col”,它包括 1) 如果它不是 NaN else,则它是“col2”中的值,2) 如果它不是 NaN else,则它是“col1”中的值, 3) 南

我正在用 .apply() 尝试这个函数,但它没有返回所需的结果

def singleval(row):
    if row['col2'] != np.NaN:
        val = row['col2']
    elif row['col1'] != np.NaN:
        val = row['col1']
    else:
        val = np.NaN
    return val

df['new col'] = df.apply(singleval,axis=1)

我希望 'new col' 中的值是 ['value2', 'value', 'nan']

最佳答案

方法一fillna

在这种情况下,我们可以简单地在 col2 上使用 fillna 和来自 col1 的值:

df['new col'] = df['col2'].fillna(df['col1'])

     col1    col2 new col
0  value1  value2  value2
1   value     NaN   value
2     NaN     NaN     NaN

方法二np.select

如果您有多个条件,请使用 np.select您传递了一个条件列表,并根据这些条件传递给它选择:

conditions = [
    df['col2'].notnull(),
    df['col1'].notnull(),
]

choices=[df['col2'], df['col1']]

df['new col'] = np.select(conditions, choices, default=np.NaN)

     col1    col2 new col
0  value1  value2  value2
1   value     NaN   value
2     NaN     NaN     NaN

注意

您的数据框与 NaN 不正确,请改用这个来测试:

df = pd.DataFrame({'col1':['value1', 'value', np.NaN],
                   'col2':['value2', np.NaN, np.NaN]})

编辑:为什么函数不起作用?

np.NaN == np.NaN 将返回 False
np.NaN 是 np.NaN 将返回 True

参见 this question对此的解释。

所以要修复你的功能,你必须使用 is not:

def singleval(row):
    if row['col2'] is not np.NaN:
        val = row['col2']
    elif row['col1'] is not np.NaN:
        val = row['col1']
    else:
        val = np.NaN
    return val

df['new col'] = df.apply(singleval, axis=1)

     col1    col2 new col
0  value1  value2  value2
1   value     NaN   value
2     NaN     NaN     NaN

关于python - 根据其他列的 if-else 填充 pandas DataFrame 的新列,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/56120928/

相关文章:

python - 在 pandas dataframe 中,如何在 iterrows 中的每一行的末尾添加一个值?

Python IMAP 搜索部分主题

python-3.x - 如何获取 Pandas Dataframe 中列列表中非重复元素的计数?

python - 为什么 Pandas 绘制索引值 (x_ticklabels) 不正确?

python - Matplotlib 干扰 NumPy(在 Windows 上)

python - 使python进程写入立即安排回写而不被标记为脏

python - python 是否有 Matlab 的 `ans` 变量捕获未存储在任何变量中的返回值?

Python 对象没有引用者但仍可通过弱引用访问?

python - 如何在一行中计算数据框中的并发事件?

python - 如何在 numpy 中对二维和一维数组求和?