Python select 并计数元素

Python select and count elements

我有一个 pandas 数据框,格式如下:

import pandas as pd

d1 = {'Product ID': ['A','B','C','D','A','D','E','A','B','C','B','C','E'], 
'Buyer ID': [1,1,1,1,2,2,2,3,3,3,4,5,5]}
df1 = pd.DataFrame(d1)

格式为:

Product ID  Buyer ID
A             1
B             1
C             1
D             1
A             2
D             2
E             2
A             3
B             3
C             3
B             4
C             5
E             5

数据框显示个人随时间购买的产品。

我想做的是获取个人购买的第一个和最后一个产品,以及在第一次和最后一次购买之间购买的产品数量。在我的示例中,买家 1 一共购买了 4 件产品,他第一次购买的是产品 A,最后一次购买的是产品 D(最后提供了完整的预期结果 table)。如果个人只购买了 1 件产品,则所列产品的结果计数将为 1。

我要获取的结果是这样的格式:

Product ID  Buyer ID    Count
    A           1         4
    D           1         4
    A           2         3
    E           2         3
    A           3         3
    C           3         3
    B           4         1
    C           5         2
    E           5         2

我无法解决这个问题。有人可以帮忙吗?

您可以使用函数列表 ["first", "last", "count"] 聚合结果,然后将其重塑为您需要的格式:

(df1.groupby("Buyer ID")["Product ID"].agg(["first", "last", "count"])
 .set_index('count', append=True).stack()
 .reset_index(level=2, drop=True)
 .rename("Product ID").reset_index().drop_duplicates())


或另一种选择,使用 groupby.apply 并使用 iloc:

获取第一行和最后一行
(df1.groupby("Buyer ID", group_keys=False)
 .apply(lambda g: g.iloc[[0,-1], :].assign(count = len(g)))
 .drop_duplicates())