заполнить новый столбец панд DataFrame на основе if-else других столбцов - PullRequest
3 голосов
/ 14 мая 2019

У меня есть ситуация, когда я хочу создать новый столбец в кадре данных Pandas и заполнить его в соответствии с условиями, включающими 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) значения в 'col2', если это не NaN, 2) значения в'col1', если это не NaN, 3) NaN

Я пытаюсь использовать эту функцию с помощью .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)

я хочу значенияв 'новый столбец' будет ['value2', 'value', 'nan']

Ответы [ 3 ]

1 голос
/ 14 мая 2019

Метод 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
0 голосов
/ 14 мая 2019

Использование df.ffill на axis=1

df['new_col'] = df.ffill(1).col2

Out[1318]:
     col1    col2 new_col
0  value1  value2  value2
1   value     NaN   value
2     NaN     NaN     NaN
0 голосов
/ 14 мая 2019

Попробуйте это:

df['col3'] = df[['col1','col2']].stack().groupby(level=0).last()

выход:

    col1    col2    col3
0   value1  value2  value2
1   value   nan     value
2   nan     nan     nan
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...