我有一个这样的数据帧:
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。如何在熊猫中按类别分组?有没有办法做到这一点?
发布于 2018-08-24 00:23:05
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发布于 2018-08-24 00:47:13
您可以创建一个定义您的组的字典。
mapping = {**dict.fromkeys([1, 2, 3], 'P'), **dict.fromkeys([4, 5], 'E')}然后,如果您将字典或callable传递给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发布于 2018-08-24 00:36:51
通常,您可以使用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.5https://stackoverflow.com/questions/51990218
复制相似问题