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

Python Pandas在给定ClientID ItemID ItemQuantity的情况下查找最常购买的物品,python,pandas,Python,Pandas,在我的数据框中,我有ClientID CartID FoodID Quantity,我想找出客户购买最多的食物是什么 我试过这个: df.groupby(["ClientID", "FoodID"])['Quantity'].sum().max(level=['ClientID', 'FoodID']).reset_index() 但是得到了一个完全错误的输出: Client FoodID Quantity 1 10 16008

在我的数据框中,我有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)

以下内容将满足您的需求:

pd.pivot_table(df, index=['ClientID', 'FoodID'], values='Quantity', aggfunc='sum').groupby('ClientID').max()

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

pd.pivot_table(df, index=['ClientID', 'FoodID'], values='Quantity', aggfunc='sum').groupby('ClientID').max()
首先获取df,其中包含每个
ClientID
FoodID
组合的总
数量。然后在
ClientID
Quantity
上对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
首先获取df,其中包含每个
ClientID
FoodID
组合的总
数量。然后在
ClientID
Quantity
上对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
编辑:

正如在您的注释中处理每个
ClientID的
FoodID
之和一样,您只需要在
idxmax的groupby之前为
sum
添加另一个groupby。这将返回元组。传递max
ClientID
FoodID
的这些元组来构造数据帧

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
的最大值上的索引。在获得每组的max
Quantity
索引后,将其传递给
loc
,以获得相应的行和列

文件

编辑:

正如在您的注释中处理每个
ClientID的
FoodID
之和一样,您只需要在
idxmax的groupby之前为
sum
添加另一个groupby。这将返回元组。传递max
ClientID
FoodID
的这些元组来构造数据帧

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
的最大值上的索引。在获得每组的max
Quantity
索引后,将其传递给
loc
,以获得相应的行和列

文件

groupby之后,您可以使用“nlargest”方法

groupby之后,您可以使用“nlargest”方法



谢谢你的回答,但它给了我一对(客户Id,最买食物的数量),我需要(客户,最买食物的Id)谢谢你的回答,但它给了我一对(客户Id,最买食物的数量),我需要(客户,最买食物的Id)这是我在第一次尝试中得到的相同输出question@ninazzo您确定吗,因为使用
删除重复项([“ClientID”]
part您不应该看到重复的
clientId
您知道现在如何修复索引列吗?调用reset\u index还会添加一个名为index的列,其中包含旧的indices@ninazzo添加
.reset\u索引(drop=True)
这与我第一次在question@ninazzo您确定吗,因为使用
删除重复项([“ClientID”]
part您不应该看到重复的
clientId
您知道现在如何修复索引列吗?调用reset\u index还会添加一个名为index的列,其中包含旧的indices@ninazzo添加
.reset\u索引(drop=True)
请您添加一个简单的解释,好吗?我认为这个答案是错误的,因为数量没有汇总,这只是给出了一次性购物中购买数量最大的商品。@ninazzo:哦,我误解了您的问题。解决方法很简单。但是,您已经接受了另一个答案,所以我将删除此答案。不,保留这是因为我发现它非常有用,可能会添加修复,所以我会比较结果以确保一切正常。请您添加一个简单的解释,好吗?我认为这个答案是错误的,因为数量没有汇总,这只是给出了一次性购物中购买数量最多的物品。@ninazzo:哦,我误解了您的问题在上。修复很简单。但是,您已经接受了另一个答案,因此我将删除此答案。不,保留它,因为我发现它非常有用。可能需要添加修复,因此我将比较结果以确保一切正常。我收到此错误“nlargest()获得意外的关键字参数'columns'”。好的!从nlargest()中省略'columns'参数。我编辑了我的答案。我遇到了以下错误“nlargest()获得了意外的关键字参数'columns'”。好吧!从nlargest()中省略'columns'参数。我编辑了我的答案。