【问题标题】:Count occurrences in DataFrame计算 DataFrame 中的出现次数
【发布时间】:2017-01-08 02:19:38
【问题描述】:

我有一个这种格式的数据框:

| Department | Person | Power  | ... |
|------------|--------|--------|-----|
| ABC        | 1234   |  75    | ... |
| ABC        | 1235   |  25    | ... |
| DEF        | 1236   |  50    | ... |
| DEF        | 1237   | 100    | ... |
| DEF        | 1238   |  25    | ... |
| DEF        | 1239   |  50    | ... |

我现在想要得到的是幂列中每个值的出现次数总和。如何从我的 DataFrame 中获取此信息?

| Department | 100 |  75 |  50 |  25 |
|------------|-----|-----|-----|-----|
| ABC        |   0 |   1 |   0 |   1 |
| DEF        |   1 |   0 |   2 |   1 |

【问题讨论】:

    标签: python pandas pivot-table reshape crosstab


    【解决方案1】:

    您可以将value_countssort_index 一起使用,然后由to_frame 生成DataFrame,最后由T 转置:

    print (df.Power.value_counts().sort_index(ascending=False).to_frame().T)
           100  75   50   25 
    Power    1    1    2    2
    

    通过评论编辑:

    你需要crosstab:

    print (pd.crosstab(df.Department, df.Power).sort_index(axis=1, ascending=False))
    Power       100  75   50   25 
    Department                    
    ABC           0    1    0    1
    DEF           1    0    2    1
    

    使用groupbyunstack 加快另一个解决方案:

    print (df.groupby(['Department','Power'])
             .size()
             .unstack(fill_value=0)
             .sort_index(axis=1, ascending=False))
    
    Power       100  75   50   25 
    Department                    
    ABC           0    1    0    1
    DEF           1    0    2    1
    

    如果需要groupbyDepartmentPerson,请将Person 列添加到groupby 到第二个位置(谢谢piRSquared):

    print (df.groupby(['Department','Person', 'Power'])
             .size()
             .unstack(fill_value=0)
             .sort_index(axis=1, ascending=False))
    
    Power              100  75   50   25 
    Department Person                    
    ABC        1234      0    1    0    0
               1235      0    0    0    1
    DEF        1236      0    0    1    0
               1237      1    0    0    0
               1238      0    0    0    1
               1239      0    0    1    0
    

    通过评论编辑1:

    如果需要添加其他缺失值,请使用reindex:

    print (df.groupby(['Department','Power'])
             .size()
             .unstack(fill_value=0)
             .reindex(columns=[100,75,50,25,0], fill_value=0))
    
    Power       100  75   50   25   0  
    Department                         
    ABC           0    1    0    1    0
    DEF           1    0    2    1    0
    

    【讨论】:

    • 谢谢,如果我有第二列要对结果进行分组,我该怎么做?
    • 你能添加想要的输出吗,对不起,我不明白group the results是什么意思。
    • 谢谢,我添加了 2 个解决方案。请检查一下。
    • @Gerrit 对于 jezrael 的第二个解决方案 groupby,请注意 Power 如何成为 groupby 中的第二列,而当 unstacked 它最终出现在列中。如果您想在第二列上添加groupby,请将其添加到groupby,如下所示:df.groupby(['Department','Person','Power'])。其余答案如上。这是您的最佳答案。
    • 谢谢@piRSquared。我添加它来回答。
    【解决方案2】:

    也可以这样:

    >>> df.groupby(['Department','Power']).count().unstack().fillna(0)
    
               Person               
    Power         25   50   75   100
    Department                      
    ABC           1.0  0.0  1.0  0.0
    DEF           1.0  2.0  0.0  1.0
    

    【讨论】:

      猜你喜欢
      • 2023-02-06
      • 2020-02-04
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2018-07-05
      • 1970-01-01
      相关资源
      最近更新 更多