我有一个像这样的数据框:
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级。如何按熊猫分类?有办法吗?
答案 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