通过聚合并将结果存储在数据帧中的两列分组最优化的方法是什么?

时间:2018-02-22 16:02:26

标签: python pandas group-by aggregation

我有一个巨大的DataFrame,其中包含三列:kleurmerkprijs。我想为每个prijs计算每kleur merk的平均值。数据如下:

occasions.head(15)

    kleur        merk   prijs
0   Zwart     Peugeot  1490.0
1   Zwart  Alfa Romeo  2450.0
2   Grijs        Fiat  3950.0
3   Groen     Hyundai  1250.0
4   Grijs  Mitsubishi  1350.0
5   Grijs      Nissan  5480.0
6    None        Opel  5950.0
7   Zwart     Peugeot  4950.0
8   Zwart     Peugeot  6950.0
9   Beige     Renault  4950.0
10  Groen      Suzuki  2250.0
11   Geel      Toyota  4980.0
12   Geel  Volkswagen  2950.0
13  Blauw  Volkswagen  2950.0
14  Beige        Fiat  7500.0

我赞扬它是风箱:

temp = []

for merk, mk_data in occasions_prijs_df.head(10).groupby(['merk']):
    for kleur, kleur_data in mk_data.groupby('kleur'):
        temp.append({'merk': merk, 'kleur':kleur, 'kleur_count':kleur_data.shape[0],
                     'prijs_avg': kleur_data['prijs'].mean()})
        print merk, kleur, kleur_data.shape[0], kleur_data['prijs'].mean()

occasions_prijs_df_gr = pd.DataFrame(temp)

输出(occasions_prijs_df_gr)应如下所示:

 kleur  kleur_count        merk    prijs_avg
0  Zwart            1  Alfa Romeo  2450.000000
1  Grijs            1        Fiat  3950.000000
2  Groen            1     Hyundai  1250.000000
3  Grijs            1  Mitsubishi  1350.000000
4  Grijs            1      Nissan  5480.000000
5  Zwart            3     Peugeot  4463.333333
6  Beige            1     Renault  4950.000000

1 个答案:

答案 0 :(得分:0)

通过汇总函数meangroupby的新列名称,使用aggsize元组列表:

tup = [('prijs_avg', 'mean'), ('kleur_count','size')]
df = df.groupby(['kleur','merk'])['prijs'].agg(tup).reset_index()
print (df)
    kleur        merk    prijs_avg  kleur_count
0   Beige        Fiat  7500.000000            1
1   Beige     Renault  4950.000000            1
2   Blauw  Volkswagen  2950.000000            1
3    Geel      Toyota  4980.000000            1
4    Geel  Volkswagen  2950.000000            1
5   Grijs        Fiat  3950.000000            1
6   Grijs  Mitsubishi  1350.000000            1
7   Grijs      Nissan  5480.000000            1
8   Groen     Hyundai  1250.000000            1
9   Groen      Suzuki  2250.000000            1
10   None        Opel  5950.000000            1
11  Zwart  Alfa Romeo  2450.000000            1
12  Zwart     Peugeot  4463.333333            3