首页
学习
活动
专区
圈层
工具
发布
社区首页 >问答首页 >将列值分组在一起

将列值分组在一起
EN

Stack Overflow用户
提问于 2018-08-24 00:18:31
回答 3查看 77关注 0票数 3

我有一个这样的数据帧:

代码语言:javascript
复制
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分组在一个类别中。然后我想要得到每个类别的价格总和和每个类别的需求总和。我也想要中庸之道。结果应该如下所示:

代码语言:javascript
复制
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。如何在熊猫中按类别分组?有没有办法做到这一点?

EN

回答 3

Stack Overflow用户

发布于 2018-08-24 00:23:05

代码语言:javascript
复制
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
票数 4
EN

Stack Overflow用户

发布于 2018-08-24 00:47:13

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

代码语言:javascript
复制
mapping = {**dict.fromkeys([1, 2, 3], 'P'), **dict.fromkeys([4, 5], 'E')}

然后,如果您将字典或callable传递给groupby,它会自动映射到索引上。因此,让我们将索引设置为Class

代码语言:javascript
复制
d = df.set_index('Class').groupby(mapping).agg(['sum', 'mean']).sort_index(1, 1)

最后,我们进行一些调整,以获得您指定的列名。

代码语言:javascript
复制
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
票数 4
EN

Stack Overflow用户

发布于 2018-08-24 00:36:51

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

代码语言:javascript
复制
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]

输出:

代码语言:javascript
复制
  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
票数 2
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/51990218

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档