>source

간격이있는 범주 열이있는 데이터 프레임에서 observe = True/False를 사용한 후 팬더에서 groupby를 사용할 때 다른 결과가 나타납니다. 원칙적으로 결과는 동일해야합니다.

예를 들어, 다음 데이터 프레임을 가정 해 봅시다 :

   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"열을 변환합니다. 또한 "a"열을 범주 형으로 만듭니다 :

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

observed = False를 입력하면 결과가 정확합니다 :

   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 열의 레이블이 잘못되었습니다!

팬더 v0.24.2 (최신 안정 버전)를 사용하고 있습니다


  • 답변 # 1

    이것은 다가오는 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
    
    

관련 자료

  • 이전 javascript - 로컬 HTML 페이지와 AngularJS 컨트롤러 파일 분리
  • 다음 Python - 파이썬 - while true 루프에서 평균 3 개의 값