【问题标题】:Python: get a frequency count based on two columns (variables) in pandas dataframe some row appersPython:根据熊猫数据框中某些行出现的两列(变量)获取频率计数
【发布时间】:2016-01-21 03:30:08
【问题描述】:

您好,我有以下数据框。

    Group           Size

    Short          Small
    Short          Small
    Moderate       Medium
    Moderate       Small
    Tall           Large

我想计算同一行在数据框中出现的频率。

    Group           Size      Time

    Short          Small        2
    Moderate       Medium       1 
    Moderate       Small        1
    Tall           Large        1

【问题讨论】:

标签: python pandas group-by dataframe


【解决方案1】:

你可以使用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

【讨论】:

  • 谢谢。根据频率(“时间”)选择前 k(=20)个值的一个小补充: df.groupby(["Group", "Size"]).size().reset_index(name="Time") .sort_values(by='Time',ascending=False).head(20);
  • 请注意,使用.size() 将返回Series,而.size().reset_index(name="Time") 是一个DataFrame。谢谢安迪。
  • 或者你也可以简单地做df.groupby(by=["Group", "Size"], as_index=False).size()
【解决方案2】:

更新 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

【讨论】:

  • 不错。你甚至可以添加margins=True 来获得边际计数!
【解决方案3】:

其他可能性是使用.pivot_table()aggfunc='size'

df_solution = df.pivot_table(index=['Group','Size'], aggfunc='size')

【讨论】:

    猜你喜欢
    • 2021-05-10
    • 2019-08-02
    • 1970-01-01
    • 2018-11-22
    相关资源
    最近更新 更多