根据多个数据框列进行频率统计

149
我有以下的数据框。
组别 大小
适中 中等
适中
我想要计算相同行在数据框中出现的频率。
Group           Size      Time
Short          Small        2
Moderate       Medium       1 
Moderate       Small        1
Tall           Large        1

2
关于性能的注意事项,包括替代方案:Pandas groupby.size vs series.value_counts vs collections.Counter with multiple series - jpp
3个回答

205
您可以使用groupby的size
In [11]: df.groupby(["Group", "Size"]).size()
Out[11]:
Group     Size
Moderate  Medium    1
          Small     1
Short     Small     2
Tall      Large     1
dtype: int64

In [12]: df.groupby(["Group", "Size"]).size().reset_index(name="Time")
Out[12]:
      Group    Size  Time
0  Moderate  Medium     1
1  Moderate   Small     1
2     Short   Small     2
3      Tall   Large     1

9
谢谢。根据频率("Time")选取前k(=20)个值,只需进行一点修改: df.groupby(["Group", "Size"]).size().reset_index(name="Time").sort_values(by='Time',ascending=False).head(20)。 - Dileep Kumar Patchigolla
1
注意使用.size()将返回Series,而.size().reset_index(name="Time")则是DataFrame。谢谢Andy。 - alemol
或者你可以简单地使用 df.groupby(by=["Group", "Size"], as_index=False).size() - Naveen Reddy Marthala

95

更新:在 pandas 1.1 版本之后,value_counts 现在接受多列输入。

df.value_counts(["Group", "Size"])

您也可以尝试使用pd.crosstab()

Group           Size

Short          Small
Short          Small
Moderate       Medium
Moderate       Small
Tall           Large

pd.crosstab(df.Group,df.Size)


Size      Large  Medium  Small
Group                         
Moderate      0       1      1
Short         0       0      2
Tall          1       0      0

编辑:为了获得您的输出

pd.crosstab(df.Group,df.Size).replace(0,np.nan).\
     stack().reset_index().rename(columns={0:'Time'})
Out[591]: 
      Group    Size  Time
0  Moderate  Medium   1.0
1  Moderate   Small   1.0
2     Short   Small   2.0
3      Tall   Large   1.0

7
不错,您甚至可以添加margins=True来获取边缘计数! - Matt Hancock
同时,df.value_counts(["Group", "Size"]).reset_index() 将其转换为数据框。 - Joe Rivera
当您计算所有列时,可以使用 df.value_counts() - Mykola Zotko

5
另一种可能性是使用 .pivot_table()aggfunc='size'
df_solution = df.pivot_table(index=['Group','Size'], aggfunc='size')

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接