Условный минимум двух столбцов с NA - PullRequest
0 голосов
/ 04 сентября 2018

Как эффективно создать новый столбец, который является минимумом столбца 3 и столбца 2, если столбец 1 имеет определенное значение?

Пример:

my_dataframe=pd.DataFrame({'col1':[1.0,2.0,3.0],
             'col2':[4.0,5.0,6.0],
             'col3':[0.25,np.nan,0.25]})

my_dataframe = my_dataframe.assign(col4 = lambda x: np.where(x['col1']>1, np.minimum(x['col2'], x['col3']), 0))
RuntimeWarning: invalid value encountered in minimum

Я предполагаю, что функция np.minimum не может обработать NA, так как я могу обойти это? Функция numpy.nanmin также не работает.

Возвращает следующую ошибку, поскольку она не применяется к массиву. TypeError: 'Series' object cannot be interpreted as an integer

Итак, я попытался написать это следующим образом

my_dataframe = my_dataframe.assign(col4 = lambda x: np.where(x['col1']>1, np.nanmin(x['col2'].values(), x['col3'].values()), 0))

, который возвращает ошибку: TypeError: 'numpy.ndarray' object is not callable

1 Ответ

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

Используйте DataFrame.min с выбором обоих столбцов для поднабора на [] или аналогичным с np.nanmin:

f = lambda x: np.where(x['col1']>1, x[['col2', 'col3']].min(axis=1), 0)
#another solution
#f = lambda x: np.where(x['col1']>1, np.nanmin(x[['col2', 'col3']].values,axis=1), 0)
my_dataframe = my_dataframe.assign(col4 = f)
print (my_dataframe)
   col1  col2  col3  col4
0   1.0   4.0  0.25  0.00
1   2.0   5.0   NaN  5.00
2   3.0   6.0  0.25  0.25
...