熊猫:如何计算独特类别?

时间:2020-07-03 05:04:24

标签: python pandas

我有一个数据框

df_input = pd.DataFrame(
        {
            "col_cate": ['A', 'A', 'B', 'B', 'A', 'A', 'B', 'B'],
            "target_bool": [True, False, True, False, True, False, True, False]
        }
    )

我想计算唯一类别的数量。所以我期望输出是这样的

col_cate, target_bool, cnt
'A'     , True       , 2
'A'     , False      , 2
'B'     , True       , 2
'B'     , False      , 2

但是df_input.group_by(["col_cate", "target_bool"]).count()给出了

Empty DataFrame
Columns: []
Index: [(A, False), (A, True), (B, False), (B, True)]

但是向dummy添加df_input就像df_input["dummy"] = 1一样。

如何在不添加虚拟对象的情况下获得按计数分组?

3 个答案:

答案 0 :(得分:6)

df_input.groupby('col_cate')['target_bool'].value_counts()

col_cate  target_bool
A         False          2
          True           2
B         False          2
          True           2

然后您可以reset_index()

答案 1 :(得分:3)

因为函数GroupBy.count用于计数值(如果有必要,则排除缺失值),如果在by的{​​{1}}参数中使用了两列,请在groupby之后指定一列:

groupby

如果要计算所有列,如果同时指定两个列,则都可以(但此处始终是相同的输出):

df = (df_input.groupby(by=["col_cate", "target_bool"])['col_cate']
              .count()
              .reset_index(name='cnt'))
print (df)
  col_cate  target_bool  cnt
0        A        False    2
1        A         True    2
2        B        False    2
3        B         True    2

或者如果使用GroupBy.size方法,它的工作方式会有所不同-它计算所有值,而不是排除丢失,因此不需要指定任何列:

df1 = (df_input.groupby(["col_cate", "target_bool"])[['col_cate','target_bool']]
               .count()
               .add_suffix('_count')
               .reset_index())
print (df1)
  col_cate  target_bool  col_cate_count  target_bool_count
0        A        False               2                  2
1        A         True               2                  2
2        B        False               2                  2
3        B         True               2                  2

答案 2 :(得分:1)

也这样:

In [54]: df_input.groupby(df_input.columns.tolist()).size().reset_index().\ 
    ...:     rename(columns={0:'cnt'}) 
Out[54]: 
  col_cate  target_bool  cnt
0        A        False    2
1        A         True    2
2        B        False    2
3        B         True    2