我在Pandas中有一个数据框,如下所示-
import pandas as pd
data = {'Category': ['cat2','cat1','cat2','cat1','cat2','cat1','cat2','cat1','cat1','cat1','cat2'],
'values': [1,2,3,1,2,3,1,2,3,5,1]}
my_data = pd.DataFrame(data)
我获得了每个类别值的最小值,最大值和平均值,并且还按如下所示重命名了列名-
# Get the minimum value for each column
min_agg = my_data.groupby('Category').min().reset_index()
min_agg.columns = [str(col) + '_min' for col in min_agg.columns]
category_min values_min
0 cat1 1
1 cat2 1
# Get the minimum value for each column
max_agg = my_data.groupby('Category').max().reset_index()
max_agg.columns = [str(col) + '_max' for col in max_agg.columns]
category_max values_max
0 cat1 5
1 cat2 3
# Get average value for each column
avg_agg = my_data.groupby('Category').mean().reset_index()
avg_agg.columns = [str(col) + '_avg' for col in avg_agg.columns]
category_avg values_avg
0 cat1 2.666667
1 cat2 1.600000
# count number of zeros
zeros_agg = my_data.groupby('Category')['values'].apply(lambda column: (column == 0).sum()).reset_index()
zeros_agg.columns = [str(col) + '_zeros' for col in zeros_agg.columns]
Category_zeros values_zeros
0 cat1 0
1 cat2 0
现在,我想垂直堆叠这4个数据框,以获得具有8条记录的最终数据框,每个数据框各2条,如下所示-
category values
cat1_min 1
cat2_min 1
cat1_max 5
cat2_max 3
cat1_avg 2.666667
cat2_avg 1.600000
cat1_zeros 0
cat2_zeros 0
输出的第一列显示在哪个类别上应用了什么聚合,第二列显示了相应的值。
我该如何使用熊猫呢?
我尝试了
vertical_stack = pd.concat([min_agg, max_agg, avg_agg,zeros_agg], axis=0 , keys=['Category_min','Category_max','Category_avg','Category_zeros'])
但是它没有给我预期的输出。
此处显示的聚合仅在1列上,但是我有一个更大的数据集,并且我正在许多列上计算此聚合。
答案 0 :(得分:2)
您可以使用所需的汇总功能来按类别进行分类,然后堆叠结果:
r = df.pivot_table(
columns='Category', values='values', aggfunc=['min', 'max', 'mean'])
r.columns = r.columns.map('_'.join)
r.T
values
min_cat1 1.000000
min_cat2 1.000000
max_cat1 5.000000
max_cat2 3.000000
mean_cat1 2.666667
mean_cat2 1.600000
这类似于
r = df.groupby('Category')['values'].agg(['min', 'max', 'mean']).stack()
r.index = r.index.map('_'.join)
r
cat1_min 1.000000
cat1_max 5.000000
cat1_mean 2.666667
cat2_min 1.000000
cat2_max 3.000000
cat2_mean 1.600000
dtype: float64
答案 1 :(得分:1)
我将利用describe
s=df.groupby('Category')['values'].describe()[['mean','max','min']].stack()
s.index=s.index.map('_'.join)
s
cat1_mean 2.666667
cat1_max 5.000000
cat1_min 1.000000
cat2_mean 1.600000
cat2_max 3.000000
cat2_min 1.000000
dtype: float64