У меня есть следующая проблема:
Учитывая данные, скажем, например,
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'
Этот другой инструмент работает очень быстро. Пока я не нашел соответствующего выражения в python.
1.) Я попробовал np.where, который выполняет итерацию по строкам, но не позволяет динамическим значениям в результате соответствовать точной строке
2.) Я пробовал.apply (лямбда...), который кажется тихим медленным.
Я был бы рад, если бы вы могли найти элегантный способ решить эту проблему. Thanx.
попробуй это:
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
Мне кажется, нужно 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
Вы можете использовать df.loc
:
df['col3'] = df['col1']
df.loc[(df['col1'] == 0 )& (~df['col2'].isnull()), 'col3'] = df['col2']