Python:在dataframe中为每个条目具有多个值的列计算值

2024-09-27 04:23:56 发布

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

我有一个餐厅的数据框,其中一列有相应的菜系。
问题是,在同一列中有多个菜系的餐厅[最多8家]

假设是这样的:

RestaurantName City   Restaurant ID Cuisines
Restaurant A    Milan    31333         French, Spanish, Italian
Restaurant B    Shanghai 63551         Pizza, Burgers
Restaurant C    Dubai    7991          Burgers, Ice Cream

下面是一个可复制的代码示例:

rst= pd.DataFrame({'RestaurantName': ['Rest A', 'Rest B', 'Rest C'], 
                   'City': ['Milan', 'Shanghai', 'Dubai'],
                    'RestaurantID': [31333,63551,7991],
                    'Cuisines':['French, Spanish, Italian','Pizza, Burgers','Burgers, Ice Cream']})

我使用stringsplit将它们扩展为8个不同的列,并将其添加到dataframe中

csnsplit=rst.Cuisines.str.split(", ",expand=True)
rst["Cuisine1"]=csnsplit.loc[:,0]
rst["Cuisine2"]=csnsplit.loc[:,1]
rst["Cuisine3"]=csnsplit.loc[:,2]
rst["Cuisine4"]=csnsplit.loc[:,3]
rst["Cuisine5"]=csnsplit.loc[:,4]
rst["Cuisine6"]=csnsplit.loc[:,5]
rst["Cuisine7"]=csnsplit.loc[:,6]
rst["Cuisine8"]=csnsplit.loc[:,7]

这让我想到: https://i.stack.imgur.com/AUSDY.png

现在我不知道如何计算各个菜系的数量,因为它们跨越了多达8个不同的栏目,比如说,如果我想看看各个城市的顶级菜系

我还试着为所有的菜系制作虚拟栏目,从菜系1到菜系8。这让我有了重复的菜系,比如Cusine1_面包房、Cusine2_面包房等等。我可以假设合并为一个,只保留一个计数为“1”的,但不知道怎么做

dummies=pd.get_dummies(data=rst,columns=["Cuisine1","Cuisine2","Cuisine3","Cuisine4","Cuisine5","Cuisine6","Cuisine7","Cuisine8"])
print(dummies.columns.tolist())

这就给我留下了所有这些专栏: https://i.stack.imgur.com/84spI.png

我尝试的第三件事是从所有8列中获取唯一的值,我有一个每种烹饪类型的重复列表。我可能可以将所有这些列添加到数据框中,但不知道如何根据列名为每一行填充计数

AllCsn=np.concatenate((rst.Cuisine1.unique(), 
                rst.Cuisine2.unique(),
                rst.Cuisine3.unique(),
                rst.Cuisine4.unique(),
                rst.Cuisine5.unique(),
                rst.Cuisine6.unique(),
                rst.Cuisine7.unique(),
                rst.Cuisine8.unique()
               ))
AllCsn=np.unique(AllCsn.astype(str))
AllCsn

这让我想到:

https://i.stack.imgur.com/O9OpW.png

我确实希望稍后创建一个模型,在该模型中,我可能会为每种菜肴创建一个列,并使用上面的“唯一”代码来获取所有列,但接下来我需要找出如何根据列标题进行计数

我是新来的,所以请容忍我,让我知道如果我需要提供更多的信息


Tags: restrstrestaurantlocuniqueburgers菜系cuisines
1条回答
网友
1楼 · 发布于 2024-09-27 04:23:56

听起来你在寻找^{}而没有展开,然后^{}

rst['Cuisines'] = rst['Cuisines'].str.split(', ')
rst = rst.explode('Cuisines')

创建一个框架,如:

  RestaurantName      City  RestaurantID   Cuisines
0         Rest A     Milan         31333     French
0         Rest A     Milan         31333    Spanish
0         Rest A     Milan         31333    Italian
1         Rest B  Shanghai         63551      Pizza
1         Rest B  Shanghai         63551    Burgers
2         Rest C     Dubai          7991    Burgers
2         Rest C     Dubai          7991  Ice Cream

然后听起来像^{}

pd.crosstab(rst['City'], rst['Cuisines'])
Cuisines  Burgers  French  Ice Cream  Italian  Pizza  Spanish
City                                                         
Dubai           1       0          1        0      0        0
Milan           0       1          0        1      0        1
Shanghai        1       0          0        0      1        0

^{}

rst[['City', 'Cuisines']].value_counts().reset_index(name='counts')
       City   Cuisines  counts
0     Dubai    Burgers       1
1     Dubai  Ice Cream       1
2     Milan     French       1
3     Milan    Italian       1
4     Milan    Spanish       1
5  Shanghai    Burgers       1
6  Shanghai      Pizza       1

通过^{}每个城市的最大值计数:

max_counts = (
    rst[['City', 'Cuisines']].value_counts()
        .groupby(level=0).head(1)
        .reset_index(name='counts')
)

max_counts

       City Cuisines  counts
0     Dubai  Burgers       1
1     Milan   French       1
2  Shanghai  Burgers       1

相关问题 更多 >

    热门问题