#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:
По сути, это то, что where
происходит внутри. Я думаю, что это может быть ошибка транспозиции. Исправлена ошибка. Получается симметричный фрейм данных и переданный фрейм, который требуется для воспроизведения. Очень тонкий. Обратите внимание, что в этой другой форме индексации (ниже) используется другой метод, который существует, поэтому все было в порядке.
In [56]: a[~do_not_replace] = b
In [57]: a
Out[57]:
0 1
0 4 3
1 6 0
Примечание: это было исправлено в master / 0.14.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
ошибка. Какую версию вы используете?