我有一个类似于这样的数据框
pd.DataFrame({'A': ['C1', 'C2', 'C3', 'C4', 'C5', 'C6', 'C7', 'C8', 'C9', 'C10'],
...: 'B': ['A', 'A', 'A', 'B', 'B', 'B', 'B', 'C', 'C', 'C'],
...: 'W': [0.5, 0.2, 0.3, 0.2, 0.1, 0.4, 0.3, 0.4, 0.5, 0.1],
...: 'V': [9, 1, 7, 4, 3, 5, 2, 6, 8, 10]})
Out[9]:
A B W V
0 C1 A 0.5 9
1 C2 A 0.2 1
2 C3 A 0.3 7
3 C4 B 0.2 4
4 C5 B 0.1 3
5 C6 B 0.4 5
6 C7 B 0.3 2
7 C8 C 0.4 6
8 C9 C 0.5 8
9 C10 C 0.1 10
我想要按照'B'列中的分组来计算加权平均值,忽略最小值和最大值(在'V'列中),其中:
W列 = 权重
V列 = 值
为了计算每个组的简单平均值,考虑所有的数值,我可以这样做:
df['mean'] = df.groupby('B').apply(lambda x: (x.V * (x.W / x.W.sum())).sum()).reindex(df.B).values
print(df)
A B W V mean
0 C1 A 0.5 9 6.8
1 C2 A 0.2 1 6.8
2 C3 A 0.3 7 6.8
3 C4 B 0.2 4 3.7
4 C5 B 0.1 3 3.7
5 C6 B 0.4 5 3.7
6 C7 B 0.3 2 3.7
7 C8 C 0.4 6 7.4
8 C9 C 0.5 8 7.4
9 C10 C 0.1 10 7.4
然而,我想忽略每个组中的最大值和最小值来计算每个组的平均值。结果应该如下所示:
A B W V meanNoMinMax
0 C1 A 0.5 9 7.0
1 C2 A 0.2 1 7.0
2 C3 A 0.3 7 7.0
3 C4 B 0.2 4 3.666667
4 C5 B 0.1 3 3.666667
5 C6 B 0.4 5 3.666667
6 C7 B 0.3 2 3.666667
7 C8 C 0.4 6 8.0
8 C9 C 0.5 8 8.0
9 C10 C 0.1 10 8.0
我该如何用一行代码(或者很少的几行)实现这个功能?
逻辑
在每个分组中忽略V中的最小值和最大值后,可以得到以下表格,用于计算每个分组中忽略最小值和最大值的平均值。
A B W V
1 C3 A 0.3 7
3 C4 B 0.2 4
4 C5 B 0.1 3
8 C9 C 0.5 8