фрейм данных pandas.где неправильно себя ведет

#python #numpy #pandas

#python #numpy #pandas

Вопрос:

Я пытаюсь реализовать функцию, которая возвращает максимальное значение в каждой позиции фрейма или серии данных, минимизируя NaN.

 In [217]: a
Out[217]: 
   0  1
0  4  1
1  6  0

[2 rows x 2 columns]

In [218]: b
Out[218]: 
    0   1
0 NaN   3
1   3 NaN

[2 rows x 2 columns]


In [219]: do_not_replace = b.isnull() | (a > b)

In [220]: do_not_replace
Out[220]: 
      0      1
0  True  False
1  True   True

[2 rows x 2 columns]


In [221]: a.where(do_not_replace, b)
Out[221]: 
   0  1
0  4  3
1  1  0

[2 rows x 2 columns]


In [222]: expected
Out[222]: 
   0  1
0  4  3
1  6  0

[2 rows x 2 columns]

In [223]: pd.__version__
Out[223]: '0.13.1'
 

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

Комментарии:

1. У вас такая же проблема с использованием «простых» numpy массивов, а не pandas фреймов данных?

Ответ №1:

Ответ №2:

Я не могу воспроизвести эту проблему с «простыми» numpy массивами:

 import numpy as np
a=array([(4,1),(6,0)])
b=array([(np.NaN,3),(3,np.NaN)])

print a
print b

do_not_replace = np.isnan(b) | (a>b)
print do_not_replace

print np.where(do_not_replace, a, b)
 

… я думаю, дает то, что вы хотите:

 array([[ 4.,  3.],
       [ 6.,  0.]])
 

@jwilner: Как предполагает @Jeff, это может быть pandas ошибка. Какую версию вы используете?