Pandas在给定ClientID ItemID ItemQuantity的情况下查找最常购买的物品

2024-05-18 22:13:32 发布

您现在位置:Python中文网/ 问答频道 /正文

在我的数据框中,我有ClientID CartID FoodID Quantity,我想找出客户购买最多的食物是什么

我试过这个:

df.groupby(["ClientID", "FoodID"])['Quantity'].sum().max(level=['ClientID', 'FoodID']).reset_index()

但是得到了一个完全错误的输出:

    Client  FoodID  Quantity
1   10      16008   24
2   10      17021   36
3   10      20665   6
4   10      20719   40
... ... ... ...
267610  200 84920   4
267611  200 85039   96
267612  200 85039   120
267613  200 85040   48
267614  200 85173   48

编辑:我也试过了

mbi.groupby("ClientID")["Quantity"].max()

但这就产生了一对(ClientID,最常购买的食物的数量),我需要(Client,FoodID)


Tags: 数据clientdfindex客户levelmaxquantity
3条回答

以下内容将提供您想要的:

pd.pivot_table(df, index=['ClientID', 'FoodID'], values='Quantity', aggfunc='sum').groupby('ClientID').max()
df.groupby(["ClientID", "FoodID"])['Quantity'].sum().reset_index().sort_values(
    ["ClientID", 'Quantity'], ascending=False).drop_duplicates(
    ["ClientID"]).sort_values('ClientID')

首先获取一个df,其中包含每个ClientIDFoodID组合的总Quantity。然后对ClientIDQuantity上的df进行排序,以便每个客户机的最高Quantity出现在顶部,最后删除每个客户机的重复项,这将删除所有客户机记录,但顶部恰好是最大数量

测试用例:

np.random.seed(0)

df = pd.DataFrame({
    'ClientID' : np.random.randint(1,10, 1000),
    'FoodID' : np.random.randint(1,10, 1000),
    'Quantity' : np.random.randint(1,10, 1000),
})

df.groupby(["ClientID", "FoodID"])['Quantity'].sum().reset_index().sort_values(
    ["ClientID", 'Quantity'], ascending=False).drop_duplicates(
    ["ClientID"]).sort_values('ClientID')

输出:

    ClientID    FoodID  Quantity
3   1           4       97
16  2           8       82
26  3           9       100
35  4           9       98
44  5           9       85
47  6           3       107
54  7           1       94
69  8           7       107
73  9           2       109

编辑:

正如在处理每个ClientIDFoodID之和的注释中一样,您只需要在idxmax的groupby之前为sum创建另一个groupby。这将返回元组。传递maxClientIDFoodID的这些元组以构造数据帧

ix = df.groupby(['ClientID', 'FoodID']).Quantity.sum().groupby(level=0).idxmax()
df_final = pd.DataFrame(ix.tolist(), columns=['ClientID', 'FoodID'])

Out[58]:
   ClientID  FoodID
0         1       4
1         2       8
2         3       9
3         4       9
4         5       9
5         6       3
6         7       1
7         8       7
8         9       2

原件:

使用idxmax获取ClientID每组在Quantity最大值上的索引。在拥有每个组的maxQuantity索引后,将其传递给loc以获得相应的行和列

文件idxmax

ix = df.groupby('ClientID').Quantity.idxmax()
df_final = df.loc[ix, ["ClientID", "FoodID"]]

相关问题 更多 >

    热门问题