мудрое замещение строк в python pandas по условию элегантным способом

1

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

Учитывая данные, скажем, например,

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.

Теги:
pandas

3 ответа

0
Лучший ответ

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

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

1

Мне кажется, нужно 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
0

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

df['col3'] = df['col1']
df.loc[(df['col1'] == 0 )& (~df['col2'].isnull()), 'col3'] = df['col2']

Ещё вопросы

Сообщество Overcoder
Наверх
Меню