如何获得每个组中的最高价值?

时间:2020-05-03 17:19:13

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

我是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的数量之和,但仅显示数量最多的前两个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

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

2 个答案:

答案 0 :(得分:1)

我对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()

这是您期望的结果吗?

enter image description here

答案 1 :(得分:1)

使用dt创建一个month,然后按s_namemonth分组,然后apply将这些函数分组,按{{ 1}},然后在name上进行sum,降序sort_values,并且仅获得head的前两行:

qty