我有一种情况,我想在 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/