代码之家  ›  专栏  ›  技术社区  ›  asongtoruin

从部分分类列获取值

  •  2
  • asongtoruin  · 技术社区  · 6 年前

    value_counts Categorical 列(特别是包含月份信息)使用 pandas

    import calendar
    import random
    
    import pandas as pd
    
    random.seed(1)
    
    month_names = calendar.month_name[1:]
    month_names += month_names
    
    df1 = pd.DataFrame({
        'Month': month_names,
        'Flag': [random.choice([True, False]) for _ in month_names]
    })
    
    df1['Month'] = pd.Categorical(
        df1['Month'], categories=calendar.month_name[1:], ordered=True
    )
    print(df1.groupby('Month')['Flag'].value_counts())
    

    按预期打印:

    Month      Flag 
    January    False    2
    February   True     2
    March      False    2
    April      True     2
    May        True     2
    June       False    2
    July       False    1
               True     1
    August     False    1
               True     1
    September  False    2
    October    True     2
    November   False    1
               True     1
    December   False    2
    Name: Flag, dtype: int64
    

    但是如果我们的 'Month' 列不包含所有可能的类别, 熊猫 抛出 ValueError

    month_names = ['January', 'February', 'March']
    month_names += month_names
    
    df2 = pd.DataFrame({
        'Month': month_names,
        'Flag': [random.choice([True, False]) for _ in month_names]
    })
    
    df2['Month'] = pd.Categorical(
        df2['Month'], categories=calendar.month_name[1:], ordered=True
    )
    print(df2.groupby('Month')['Flag'].value_counts())
    

    加薪:

    ValueError: operands could not be broadcast together with shape (12,) (3,)
    

    我们有什么办法能得到合适的答案吗 值\u计数 部分数据的结果?理想情况下,这将保留完整的类别,但即使没有将是一个开始。

    1 回复  |  直到 6 年前
        1
  •  2
  •   Jondiedoop    6 年前

    observed -关键字:

    print(df2.groupby('Month', observed=True)['Flag'].value_counts())
    #Month     Flag 
    #January   False    1
    #          True     1
    #February  True     2
    #March     False    2
    #Name: Flag, dtype: int64
    

    要获取groupby中的所有值,可以使用 crosstab reindex 使用所有类别。老实说,我不知道为什么 GroupBy 给出错误 value_counts() stack 使 Flag -多索引中的列:

    (pd.crosstab(df2['Month'], df2['Flag'])
    .reindex(df2['Month'].cat.categories.tolist(), fill_value=0)
    .stack())
    #Month      Flag 
    #January    False    1.0
    #           True     1.0
    #February   False    0.0
    #           True     2.0
    #March      False    2.0
    #           True     0.0
    #April      False    0.0
    #           True     0.0
    #May        False    0.0
    #           True     0.0
    #June       False    0.0
    #           True     0.0
    #July       False    0.0
    #           True     0.0
    #August     False    0.0
    #           True     0.0
    #September  False    0.0
    #           True     0.0
    #October    False    0.0
    #           True     0.0
    #November   False    0.0
    #           True     0.0
    #December   False    0.0
    #           True     0.0