将列值分组在一起

时间:2018-08-23 16:18:31

标签: python pandas

我有一个像这样的数据框:

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级。如何按熊猫分类?有办法吗?

3 个答案:

答案 0 :(得分:4)

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

答案 1 :(得分:4)

您可以创建一个字典来定义您的组。

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

答案 2 :(得分:2)

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

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