Метод 1 fillna
В этом случае мы можем просто использовать fillna
на col2
со значениями от 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
Метод 2 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 is np.NaN
вернет True
.
См. этот вопрос для объяснения этого.
Итак, чтобы исправить свою функцию, вы должны использовать 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