мудрое замещение строк в python pandas по условию элегантным способом - PullRequest
0 голосов
/ 24 сентября 2018

У меня есть следующая проблема:

При заданном кадре данных, скажем, например,

import pandas as pd
df = pd.DataFrame({'col1':[1,0,0,1],'col2':['B','B','A','A'],'col3':[1,2,3,4]})

В другом инструменте я легко могу создать новый столбец на основе условия, скажем

Создать новый столбец 'col3' с 'col2', если df ['col1'] == '0' & ~ df ['col2']. Isnull () else 'col1'

Thisдругой инструмент работает довольно быстро.До сих пор я не нашел соответствующего выражения в python.

1.) Я пробовал np.where, который перебирает строки, но не допускает динамических значений в результате, соответствующем точной строке

2.) Я попробовал .apply (лямбда ...), которая кажется тихо медленной.

Я был бы рад, если бы вы могли найти элегантный способ решить эту проблему.Thanx.

Ответы [ 3 ]

0 голосов
/ 24 сентября 2018

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

import numpy as np
df['new_col'] = np.where(df['col1'] == 0 & (~df['col2'].isnull()), df['col2'], df['col1'] )

np.where быстрее, чем pd.apply: Почему np.where быстрее, чем pd.apply

0 голосов
/ 24 сентября 2018

Вы можете использовать df.loc:

df['col3'] = df['col1']
df.loc[(df['col1'] == 0 )& (~df['col2'].isnull()), 'col3'] = df['col2']
0 голосов
/ 24 сентября 2018

Я думаю, нужно numpy.where с notnull вместо инвертированного isnull (спасибо @jpp):

df = pd.DataFrame({'col1':[1,0,0,1],'col2':['B','B','A','A'],'col3':[1,2,3,4]})

df['col3'] = np.where((df['col1'] == 0) & (df['col2'].notnull()), df['col2'], df['col1'])
print (df)
   col1 col2 col3
0     1    B    1
1     0    B    B
2     0    A    A
3     1    A    1
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...