Панды проверяют, совпадают ли два столбца - PullRequest
2 голосов
/ 16 октября 2019
df = {'A':[3, 4, 5, np.nan, 6, 7],
        'B':[np.nan, 4, np.nan, np.nan, 6, 7]}

У меня есть фрейм данных с двумя столбцами, A и B. Я хочу создать новый столбец C, который является результатом проверки того, являются ли A и B одинаковыми, и сохраняют ли они его. но если один - NaN, тогда оставьте другое значение. Столбцы A и B всегда являются либо значением, либо NaN. Значения в A и B всегда одинаковы.

Я знаю, как проверить, одинаковы ли A и B:

df['C'] = (df['A'] == df['B]).astype('object')

Но это дает логический ответ в столбце C, является ли этоправда или ложь. Мой ожидаемый результат будет:

A   B   C
3  NaN  3
4   4   4
5  NaN  5
NaN NaN NaN
6   6   6
7   7   7

Ответы [ 4 ]

3 голосов
/ 16 октября 2019

Используйте np.select, где вы можете проверить несколько условий.

df = pd.DataFrame({'A':[3, 4, 5, np.nan, 6, np.nan],
    'B':[np.nan, 4, np.nan, np.nan, 6, 7]})

df['c'] = np.select([df['A'].isnull() & df['B'].isnull(), df['A'].isnull()], 
                     [np.nan, df['B']], df['A'])

Выход:

    A    B       c
0   3.0  NaN     3.0
1   4.0  4.0     4.0
2   5.0  NaN     5.0
3   NaN  NaN     NaN
4   6.0  6.0     6.0
5   NaN  7.0     7.0
3 голосов
/ 16 октября 2019

Вы можете использовать np.where()

>>> df = pd.DataFrame({'A':[3, 4, 5, np.nan],'B':[np.nan,4,np.nan,np.nan]})
>>> df
     A    B
0  3.0  NaN
1  4.0  4.0
2  5.0  NaN
3  NaN  NaN

>>> df['C'] = np.where(df['A'].isna(), df['B'], df['A'])
>>> df
     A    B    C
0  3.0  NaN  3.0
1  4.0  4.0  4.0
2  5.0  NaN  5.0
3  NaN  NaN  NaN

Отредактированный образец

Показывает, что это будет работать, если df['A'] равно nan, а df['B'] имеет значение.

>>> df = pd.DataFrame({'A':[3, np.nan, 5, np.nan],'B':[np.nan,4,np.nan,np.nan]})
>>> df
     A    B
0  3.0  NaN
1  NaN  4.0
2  5.0  NaN
3  NaN  NaN

>>> df['C'] = np.where(df['A'].isna(), df['B'], df['A'])
>>> df
     A    B    C
0  3.0  NaN  3.0
1  NaN  4.0  4.0
2  5.0  NaN  5.0
3  NaN  NaN  NaN

Спасибо: D

2 голосов
/ 16 октября 2019

Если гарантировано, что A & B - это идентичные значения, когда не nans, тогда, похоже, вы могли бы использовать .combine_first здесь:

df['C'] = df.A.combine_first(df.B)
1 голос
/ 16 октября 2019

Я думаю fillna достаточно для вашего требования

df['C'] = df.A.fillna(df.B)

Out[92]:
     A    B    C
0  3.0  NaN  3.0
1  4.0  4.0  4.0
2  5.0  NaN  5.0
3  NaN  NaN  NaN
4  6.0  6.0  6.0
5  7.0  7.0  7.0
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...