Странное поведение с медианами панд - PullRequest
0 голосов
/ 19 февраля 2019

Рассмотрим следующий фрейм данных:

       b           c     d     e  f     g     h
0   6.25  2018-04-01  True   NaN  7  54.0  64.0
1  32.50  2018-04-01  True   NaN  7  54.0  64.0
2  16.75  2018-04-01  True   NaN  7  54.0  64.0
3  29.25  2018-04-01  True   NaN  7  54.0  64.0
4  21.75  2018-04-01  True   NaN  7  54.0  64.0
5  21.75  2018-04-01  True  True  7  54.0  64.0
6   7.75  2018-04-01  True  True  7  54.0  64.0
7  23.25  2018-04-01  True  True  7  54.0  64.0
8  12.25  2018-04-01  True  True  7  54.0  64.0
9  30.50  2018-04-01  True   NaN  7  54.0  64.0

(скопируйте и вставьте и используйте df = pd.read_clipboard() для создания фрейма данных)

Нахождение медианы изначально работает без проблем:

df.median()

b    21.75
d     1.00
e     1.00
f     7.00
g    54.00
h    64.00
dtype: float64

Однако, если столбец отброшен, а затем найден median, медиана для столбца e исчезает:

new_df = df.drop(columns=['b'])
new_df.median()

d     1.0
f     7.0
g    54.0
h    64.0
dtype: float64

Это поведение немного неожиданно, и поиск медианы дляСтолбец e сам по себе все еще работает:

new_df['e'].median()
1.0

Использование skipna=False не имеет значения:

new_df.median(skipna=False)

d     1.0
f     7.0
g    54.0
h    64.0
dtype: float64

(это относится к исходному кадру данных):

df.median(skipna=False)

b    21.75
d     1.00
e      NaN
f     7.00
g    54.00
h    64.00
dtype: float64

Тип данных столбца e равен object в обоих df и new_df, и единственное различие между этими двумя фреймами данных - new_df, в котором нет столбца b.Добавление столбца обратно в new_df не решает проблему.Это происходит только тогда, когда первый столбец b удален.Это не происходит, если столбец e является типом данных с плавающей точкой или целочисленным типом.

Это поведение присутствует как в pandas==0.22.0, так и в pandas==0.24.1

. Теперь существует открытый 10 * * GitHubпроблема для всех, кто попытается решить эту проблему!

1 Ответ

0 голосов
/ 21 февраля 2019

Это похоже на ошибку.Когда мы отправляем любой df на median, это соответствует внутренней функции _reducenumeric_only, установленным на None, это вычисляет медиану по рядам и игнорирует ошибки (для столбцов c, например, для вычисления медианы не удастся.) И накапливает результаты (см. _reduce в исходном ядре / кадре панды)..py).Пока все хорошо.Но, склеивая результаты вместе, он проверяет, являются ли результаты скалярными или последовательными (для median это будет, конечно, скаляр).Чтобы сделать эту проверку, всегда используйте первый столбец (см. wrap_results в pandas source core / apply.py).Таким образом, если первый столбец calc завершился неудачно и он был пропущен, эта проверка завершится неудачно, что вызовет исключение.Это запускает резервный метод в пределах _reduce от принудительного преобразования кадра данных только в числовое значение (отбрасывая все столбцы с NaN) и повторно вычисляет медианы.

Так что в вашем случае, если столбец c (или любой другойдругой dtype, где вычисление медианы не удастся, как текст), находится в первом столбце, тогда все столбцы с NaN также будут отброшены для медианных результатов.Установка skipna не меняется, поскольку ошибка заключается в том, что нецифровый столбец в первой позиции запускает принудительное вычисление только чисел.Я не вижу возможного исправления без исправления в базе кодов панд.Или гарантируя, что первый столбец всегда будет успешным для вычисления медианы.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...