【问题标题】:How to get the top values within each group?如何获得每个组中的最高值?
【发布时间】:2020-05-03 17:19:13
【问题描述】:

我是 Pandas 的新手,我有一个看起来像这样的数据集。

s_name  Time        p_name  qty
A       12/01/2019  ABC     1
A       12/01/2019  ABC     1
A       12/01/2019  DEF     2
A       12/01/2019  DEF     2
A       12/01/2019  FGH     0
B       13/02/2019  ABC     3
B       13/02/2019  DEF     1
B       13/02/2019  DEF     1
B       13/03/2019  ABC     3
B       13/03/2019  FGH     0

我正在尝试按 s_name 分组并找到一个月内每个唯一 p_name 的数量总和,但只显示数量最多的前 2 个 p_name。下面是我希望最终输出的样子的示例。

s_name  Time        p_name  qty
A       01          DEF     4
A       01          ABC     2
B       02          ABC     3
B       02          DEF     2
B       03          ABC     2
B       03          FGH     0

你有什么想法吗?我被困在这里很长时间了,非常感谢您的帮助。

【问题讨论】:

  • 能否提供文字而不是图片。
  • @SandeepKadapa 我已编辑。抱歉,我的帖子不多。

标签: python-3.x pandas dataframe pandas-groupby


【解决方案1】:

使用dt 创建一个month,然后按s_namemonth 分组,然后apply 为组添加一个函数,按name 对每个组进行分组,然后在@987654332 上执行sum @, sort_values 降序,只得到前两行head

df.Time = pd.to_datetime(df.Time, format='%d/%m/%Y')
df['month'] = df.Time.dt.month

df_f = df.groupby(['s_name', 'month']).apply(
    lambda df:
        df.groupby('p_name').qty.sum()
        .sort_values(ascending=False).head(2)
).reset_index()

df_f
#   s_name  month   p_name  qty
# 0 A   1   DEF 4
# 1 A   1   ABC 2
# 2 B   2   ABC 3
# 3 B   2   DEF 2
# 4 B   3   ABC 3
# 5 B   3   FGH 0

【讨论】:

    【解决方案2】:

    我自己是 Pandas 的新手。我将尝试回答您的问题。

    查看此代码。

    from io import StringIO
    import pandas as pd
    
    columns = "s_name Time p_name qty"
    
    # Create dataframe from text.
    df = pd.read_csv(
        StringIO(
            f"""{columns}
    A 12/01/2019 ABC 1
    A 12/01/2019 ABC 1
    A 12/01/2019 DEF 2
    A 12/01/2019 DEF 2
    A 12/01/2019 FGH 0
    B 13/02/2019 ABC 3
    B 13/02/2019 DEF 1
    B 13/02/2019 DEF 1
    B 13/03/2019 ABC 3
    B 13/03/2019 FGH 0"""
        ),
        sep=" ",
    )
    
    
    S_NAME, TIME, P_NAME, QTY = columns.split()
    MONTH = "month"
    
    # Convert the TIME col to datetime types.
    df.Time = pd.to_datetime(df.Time, dayfirst=True)
    
    
    # Create a month column with zfilled strings.
    df[MONTH] = df.Time.apply(lambda x: str(x.month).zfill(2))
    
    
    # Group
    group = df.groupby(by=[S_NAME, P_NAME, MONTH])
    
    
    gdf = (
        group.sum()
        .sort_index()
        .sort_values(by=[S_NAME, MONTH, QTY], ascending=False)
        .reset_index()
    )
    
    gdf.groupby([S_NAME, MONTH]).head(2).sort_values(by=[S_NAME, MONTH]).reset_index()
    

    这是你预期的结果吗?

    【讨论】:

      猜你喜欢
      • 2019-10-02
      • 2022-11-20
      • 2020-02-11
      • 2020-05-03
      • 2020-09-16
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2022-01-20
      相关资源
      最近更新 更多