我有一个数据框
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
一样。
如何在不添加虚拟对象的情况下获得按计数分组?
答案 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