将列值分组到一起

2024-09-27 19:26:01 发布

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

我有这样一个数据帧:

Class  price  demand
1       22       8
1       60       7
3       32       14
2       72       9
4       45       20
5       42       25

我要做的是把1-3班分成一类,把4-5班分成一类。然后我想得到每种商品的价格和需求的总和。我也想知道平均值。结果应该是这样的:

Class   TotalPrice   TotalDemand   AveragePrice  AverageDemand
P          186            38           46.5          9.5   
E          87             45           43.5          22.5

其中p是1-3级,E是4-5级。我如何在熊猫中按类别分组?有办法吗?你知道吗


Tags: 数据价格类别priceclass商品平均值总和
3条回答

您可以创建一个定义组的字典。你知道吗

mapping = {**dict.fromkeys([1, 2, 3], 'P'), **dict.fromkeys([4, 5], 'E')}

然后,如果您传递字典或可调用到groupby,它会自动映射到索引上。那么,让我们将索引设置为Class

d = df.set_index('Class').groupby(mapping).agg(['sum', 'mean']).sort_index(1, 1)

最后,我们做了一些调整,以获得您指定的列名。你知道吗

rename_dict = {'sum': 'Total', 'mean': 'Average'}
d.columns = d.columns.map(lambda c: f"{rename_dict[c[1]]}{c[0].title()}")

d.rename_axis('Class').reset_index()

  Class  TotalPrice  TotalDemand  AveragePrice  AverageDemand
0     E          87           45          43.5           22.5
1     P         186           38          46.5            9.5

通常,您可以使用pd.cut形成任意存储箱来对数据进行分组,并指定正确的存储箱边缘:

import pandas as pd

pd.cut(df.Class, bins=[0, 3, 5], labels=['P', 'E'])
#0    P
#1    P
#2    P
#3    P
#4    E
#5    E

df2 = (df.groupby(pd.cut(df.Class, bins=[0,3,5], labels=['P', 'E']))[['demand', 'price']]
         .agg({'sum', 'mean'}).reset_index())

# Get rid of the multi-level columns
df2.columns = [f'{i}_{j}' if j != '' else f'{i}' for i,j in df2.columns]

输出:

  Class  demand_sum  demand_mean  price_sum  price_mean
0     P          38          9.5        186        46.5
1     E          45         22.5         87        43.5
In [8]: df.groupby(np.where(df['Class'].isin([1, 2, 3]), 'P', 'E'))[['price', 'demand']].agg(['sum', 'mean'])
Out[8]: 
  price       demand      
    sum  mean    sum  mean
E    87  43.5     45  22.5
P   186  46.5     38   9.5

相关问题 更多 >

    热门问题