我正在尝试从专栏中获得低,高和均值。但是,我只想按列值进行汇总。例如,如果我们有2个具有相同列值的行,则将这两个行汇总在一起。而且,它们必须是同一载体。像这样:
处理之前:
carrier class price
SP A 22
VZ C 33
XM A 50
XM D 20
SP A 88
VZ C 100
处理后:
carrier class price low high mean
SP A 22 22 88 55
VZ C 33 33 100 66.5
XM A 50 50 50 50
XM D 20 20 20 20
SP A 88 22 88 55
VZ C 100 33 100 66.5
如您所见,如果我们具有相同的载体和相同的类别,那么我们进行汇总并得到低,高和均值。如果我们拥有相同的承运人,但没有相同的舱位,那么我们就不会汇总,但是我们仍然会得到低,高的均值,该均值与舱位的价格相同。
我希望结果与处理后的结果完全一样。结果应该是一个数据框。我该怎么做?
答案 0 :(得分:3)
将DataFrameGroupBy.agg
与元组列表结合使用,并使用聚合函数将新列名称与原始DataFrame
的{{3}}配合使用:
d = [('low','min'),('high','max'),('mean','mean')]
df1 = df.join(df.groupby(['carrier','class'])['price'].agg(d), on=['carrier','class'])
print (df1)
carrier class price low high mean
0 SP A 22 22 88 55.0
1 VZ C 33 33 100 66.5
2 XM A 50 50 50 50.0
3 XM D 20 20 20 20.0
4 SP A 88 22 88 55.0
5 VZ C 100 33 100 66.5
详细信息:
print (df.groupby(['carrier','class'])['price'].agg(d))
low high mean
carrier class
SP A 22 88 55.0
VZ C 33 100 66.5
XM A 50 50 50.0
D 20 20 20.0
或使用join
有趣的解决方案:
d = [('low','min'),('high','max'),('mean','mean')]
g = df.groupby(['carrier','class'])['price']
for i, j in d:
df[i] = g.transform(j)
print (df)
carrier class price low high mean
0 SP A 22 22 88 55.0
1 VZ C 33 33 100 66.5
2 XM A 50 50 50 50.0
3 XM D 20 20 20 20.0
4 SP A 88 22 88 55.0
5 VZ C 100 33 100 66.5