Python 3.x 如何获得每组中的最高值?

Python 3.x 如何获得每组中的最高值?,python-3.x,pandas,dataframe,pandas-groupby,Python 3.x,Pandas,Dataframe,Pandas Groupby,我刚接触熊猫,我有一个类似这样的数据集 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

我刚接触熊猫,我有一个类似这样的数据集

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_名称分组,并查找每个唯一p_名称在一个月内的数量总和,但仅显示p_名称和前两个最大数量。下面是我希望最终输出的示例

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

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

我自己对熊猫还不熟悉。我将尝试回答你的问题

请参阅此代码

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()
这是你期望的结果吗


我对熊猫是个新手。我将尝试回答你的问题

请参阅此代码

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()
这是你期望的结果吗


使用创建一个
,然后按
s_name
分组,然后将一个函数添加到组中,按
名称
分组,对
数量
进行一次
求和
,降序,只得到前两行:


使用创建一个
,然后按
s_name
分组,然后向组添加一个函数,按
名称
分组,并对
数量
进行一次
求和
,降序,只得到前两行:


你能提供文本而不是图像吗?@SandeepKadapa我已经编辑过了。抱歉,我的帖子不多。你能提供文本而不是图片吗?@SandeepKadapa我已经编辑过了。对不起,我没有贴太多。