如何根据列出现的次数添加其他列

2024-05-16 09:11:04 发布

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

我有两个数据框(菜单和订单),我想根据菜单数据框的流行程度(它在“订单”数据框中出现的次数)来标记菜单数据框中的项目

import pandas as pd

menu = pd.DataFrame(
    {'Item_Name':['Chicken Pizza','Mushroom Soup','Tiramisu'],
    'Price':[8.99, 4.99, 5.99]})

orders = pd.DataFrame(
    {'order':[1,2,3,4,5,6,7,8],
    'Item Name':['Chicken Pizza','Mushroom Soup','Tiramisu','Chicken Pizza','Chicken Pizza','Mushroom Soup','Chicken Pizza','Tiramisu']})

菜单

        Item_Name    Price  
0   Chicken Pizza     8.99
1   Mushroom Soup     4.99
2        Tiramisu     5.99

命令

   order      Item Name  
0   1     Chicken Pizza    
1   2     Mushroom Soup
2   3          Tiramisu    
3   4     Chicken Pizza
4   5     Chicken Pizza    
5   6     Mushroom Soup    
6   7     Chicken Pizza    
7   8          Tiramisu

期望输出: 如果订购的物品超过所有订购物品的中位数,则为“1”;如果少于或等于订购次数的中位数,则为“0”

        Item_Name    Price    Popular
0   Chicken Pizza     8.99          1
1   Mushroom Soup     4.99          0
2        Tiramisu     5.99          0

我尝试过使用这种语法,但不起作用

menu["Popular"] = lambda x: 1 if orders["Item Name"].count() > orders["Item Name"].median() else 0

Tags: 数据name订单菜单item次数pricetiramisu
2条回答

您可以groupby“Item Name”+size对项目进行计数,然后计算中位数并查找大于(gt)的元素。输出为布尔值,通过更改类型将其转换为int。最后merge使用“菜单”显示0/1的输出序列:

s = orders.groupby('Item Name').size()
menu.merge(s.gt(s.median()).astype(int).rename('Popular'),
           left_on='Item_Name', right_index=True)

输出:

       Item_Name  Price  Popular
0  Chicken Pizza   8.99        1
1  Mushroom Soup   4.99        0
2       Tiramisu   5.99        0

我们需要^{}来获得每个项目的编号。然后我们可以将其与计数^{}而不是整个数据帧进行比较,将真/假值转换为1/0(^{}),并将^{}返回到Item_Name列上的menu

counts = orders.groupby('Item Name')['Item Name'].count()
menu = menu.join(
    (counts > counts.median()).astype(int).rename('Popular'),
    on='Item_Name'
)

或者用^{}代替groupby count

counts = orders['Item Name'].value_counts()
menu = menu.join(
    (counts > counts.median()).astype(int).rename('Popular'),
    on='Item_Name'
)

任何一种方法都会得到menu

       Item_Name  Price  Popular
0  Chicken Pizza   8.99        1
1  Mushroom Soup   4.99        0
2       Tiramisu   5.99        0

相关问题 更多 >