как заполнить новый столбец из условий, основанных на двух существующих столбцах, в Pandas? - PullRequest
2 голосов
/ 31 марта 2020

Я пытаюсь создать новый столбец на основе условий из двух существующих столбцов, но получаю ошибку после использования "np.where", есть ли другой способ добиться этого?

Ввод:

change1 change2
yes     yes
yes     no
no      yes
no      yes

Ожидаемый результат:

change1 change2 change3
yes      yes      ok
yes      no       not ok
no       yes      not ok
no       yes      not ok

Код:

import pandas as pd
import numpy as np



df1=pd.read_csv('test2.txt',sep='\t')
df1['change1'] = df1['change1'].astype(str)
df1['change2'] = df1['change2'].astype(str)


df['change3'] = np.where(df1['change1']=='yes' & df1['change2'] == 'yes', 'ok', 'not ok')

print(df1)

Ошибка:

cannot compare a dtyped [object] array with a scalar of type [bool]

Ответы [ 3 ]

5 голосов
/ 31 марта 2020

Используйте DataFrame.eq и DataFrame.all. Это поможет вам улучшить синтаксис кода и избежать ошибок.

df['change3'] = np.where(df.eq('yes').all(axis=1), 'ok' , 'not ok')
#if you need select columns
#df['change3'] = np.where(df[['change1', 'change2']].eq('yes').all(axis=1),
                          'ok' , 'not ok')

без DataFrame.all

df['change3'] = np.where((df1['change1']=='yes') & (df1['change2'] == 'yes'), 
                         'ok', 'not ok')

или

df['change3'] = np.where(df1['change1'].eq('yes') & df1['change2'].eq('yes'), 
                         'ok', 'not ok')

Вы также можете использовать Series.map / Series.replace

 df['change3'] = df.eq('yes').all(axis=1).map({True : 'ok' , False : 'not ok'})
#df['change3'] = df.eq('yes').all(axis=1).replace({True : 'ok' , False : 'not ok'})

print(df)

#   change1 change2 change3
# 0     yes     yes      ok
# 1     yes      no  not ok
# 2      no     yes  not ok
# 3      no     yes  not ok
4 голосов
/ 31 марта 2020

Использование DataFrame.replace для преобразования в двоичный файл, затем проверка all для строки:

df1['change3'] = np.where(df1.replace({'yes': 1, 'no': 0}).all(axis=1), 
                          'ok', 
                          'not ok')

Или с replace и sum:

df1['change3'] = np.where(df1.replace({'yes': 1, 'no': 0}).sum(axis=1).gt(1), 
                          'ok', 
                          'not ok')
  change1 change2 change3
0     yes     yes      ok
1     yes      no  not ok
2      no     yes  not ok
3      no     yes  not ok
3 голосов
/ 31 марта 2020

вы можете использовать:

df['change3'] = df.apply(lambda x: 'ok' if x['change1'] == x['change2'] else 'not ok', axis=1)

выход:

enter image description here

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...