【问题标题】:Get the max value from each group with pandas.DataFrame.groupby使用 pandas.DataFrame.groupby 从每个组中获取最大值
【发布时间】:2021-04-08 16:03:41
【问题描述】:

我需要聚合我的数据框的两列,计算第二列的值,然后只取“count”列中值最高的行,让我展示一下:

df =
col1|col2
---------
  A | AX
  A | AX
  A | AY
  A | AY
  A | AY
  B | BX
  B | BX
  B | BX
  B | BY
  B | BY
  C | CX
  C | CX
  C | CX
  C | CX
  C | CX
------------

df1 = df.groupby(['col1', 'col2']).agg({'col2': 'count'})
df1.columns = ['count']
df1= df1.reset_index()

out:
col1 col2 count
A    AX   2
A    AY   3
B    BX   3
B    BY   2
C    CX   5

到目前为止一切顺利,但现在我只需要获取每个 'col1' 组中具有最大 'count' 值的行,但将值保留在 'col2' 中。

expected output in the end:

col1 col2 count
  A  AY   3
  B  BX   3
  C  CX   5

我不知道该怎么做。到目前为止,我使用 max() 聚合的尝试总是将 'col2' 排除在外。

【问题讨论】:

    标签: python pandas


    【解决方案1】:

    从您的原始 DataFrame 中,您可以 .value_counts,它返回组内的降序计数,然后给定此排序 drop_duplicates 将保持组内最频繁。

    df1 = (df.groupby('col1')['col2'].value_counts()
             .rename('counts').reset_index()
             .drop_duplicates('col1'))
    
      col1 col2  counts
    0    A   AY       3
    2    B   BX       3
    4    C   CX       5
    

    【讨论】:

    • 是的!非常感谢
    【解决方案2】:

    可能不理想,但这可行:

    df1.loc[df1.groupby(level=0).idxmax()['count']]
    col1    col2    count
    A       AY      3
    B       BX      3
    C       CX      5
    

    这是因为 loc 中的 groupby 将返回一个索引列表,然后 loc 将向上拉。

    【讨论】:

      【解决方案3】:

      我猜你需要这个:df['qty'] = 1 然后 df.groupby([['col1', 'col2']].sum().reset_index(drop=True)

      【讨论】:

        猜你喜欢
        • 1970-01-01
        • 2017-09-12
        • 1970-01-01
        • 2010-09-16
        • 1970-01-01
        • 2018-04-28
        • 2017-04-17
        • 1970-01-01
        相关资源
        最近更新 更多