Различные результаты с наблюдаемым = верно / неверно в группе панд - PullRequest
1 голос
/ 28 мая 2019

Я получаю разные результаты при использовании groupby в пандах после использования наблюдаемого = True / False в кадре данных с категориальным столбцом с интервалами. В принципе, я считаю, что у меня должны быть точно такие же результаты.

В качестве примера, давайте предположим следующий фрейм данных:

    df_testing = pd.DataFrame({"a": ["good", "good", "good", "bad", "good", "good", "bad", "good",
                                "good", "good"],
                          "b": [1, 1, 2, 2, 3, 4, 5, 6, 11111, -5455]})

Я преобразую столбец «b», чтобы сгруппировать значения в разные интервалы. Я также заставляю столбец «а» быть категоричным:

    df_testing["a"] = df_testing["a"].astype("category")
    df_testing["b"] = pd.cut(df_testing["b"], [-9999, 0, 2, 5, 1e99], right=True)

Если я поставлю наблюдаемое = Ложь, результаты будут правильными:

    In[310]: df_testing.groupby(by="b", observed=False)["a"].value_counts()

    Out[310]:
    b               a   
    (-9999.0, 0.0]  good    1
    (0.0, 2.0]      good    3
                    bad     1
    (2.0, 5.0]      good    2
                    bad     1
    (5.0, 1e+99]    good    2
    Name: a, dtype: int64

Но для наблюдаемых = True:

    In[311]: df_testing.groupby(by="b", observed=True)["a"].value_counts()

    Out[311]:
    b               a   
    (0.0, 2.0]      good    1
    (2.0, 5.0]      good    3
                    bad     1
    (5.0, 1e+99]    good    2
                    bad     1
    (-9999.0, 0.0]  good    2
    Name: a, dtype: int64

Как видите, счет одинаков ... Но метки для столбца b во втором случае неверны!

Я использую pandas v0.24.2 (последняя стабильная версия)

1 Ответ

0 голосов
/ 28 мая 2019

Это ошибка в пандах , исправленная в предстоящем выпуске 0.25.0:

In [1]: import pandas as pd; pd.__version__
Out[1]: '0.25.0.dev0+596.g20d0ad159a'

In [2]: df_testing = pd.DataFrame({"a": ["good", "good", "good", "bad", "good", "good",
   ...:                                  "bad", "good", "good", "good"],
   ...:                            "b": [1, 1, 2, 2, 3, 4, 5, 6, 11111, -5455]})

In [3]: df_testing["a"] = df_testing["a"].astype("category")

In [4]: df_testing["b"] = pd.cut(df_testing["b"], [-9999, 0, 2, 5, 1e99], right=True)

In [5]: df_testing.groupby(by="b", observed=False)["a"].value_counts()
Out[5]:
b               a
(-9999.0, 0.0]  good    1
(0.0, 2.0]      good    3
                bad     1
(2.0, 5.0]      good    2
                bad     1
(5.0, 1e+99]    good    2
Name: a, dtype: int64

In [6]: df_testing.groupby(by="b", observed=True)["a"].value_counts()
Out[6]:
b               a
(-9999.0, 0.0]  good    1
(0.0, 2.0]      good    3
                bad     1
(2.0, 5.0]      good    2
                bad     1
(5.0, 1e+99]    good    2
Name: a, dtype: int64
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...