Python 选择和计数元素

标签 python python-2.7 pandas data-cleaning

我有一个以下格式的 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(最后提供了完整的预期结果表)。如果个人只购买了 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"] 来聚合结果,然后将其 reshape 为您需要的格式:

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

enter image description here


或者另一种选择,使用 groupby.apply 并使用 iloc 获取第一行和最后一行:

(df1.groupby("Buyer ID", group_keys=False)
 .apply(lambda g: g.iloc[[0,-1], :].assign(count = len(g)))
 .drop_duplicates())

enter image description here

关于Python 选择和计数元素,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/42737395/

相关文章:

Python如何缩短uuuid并解码?

Python 遍历列表并将没有特殊字符的行连接到前一项

python - 动画改变点之间的线条数量 - Python

python - 如何在 pandas 中将当前行值添加到后续值的总和(相对于该行对应的日期)?

python - f2py - 函数参数的顺序困惑

python - 从 statsmodels 调用 volution_filter 时出现类型错误

python - 分隔行 python pandas

python - scipy sparse diags 矩阵构造错误

python - 在 Python 2.7 中隐藏导出列表中的名称

python - 对多个 pandas 数据帧执行相同操作的正确方法是什么?