基于聚合和当前记录排除的Python中位数计算
我想添加一个新列,这个列的值是根据某个关键值分组后计算出的中位数,但在计算中位数的时候要排除掉每条记录自己。
下面是一个数据示例,以及我希望得到的输出结果:
df = pd.DataFrame({ 'key': ['A', 'A', 'A', 'A', 'A', 'A', 'A', 'B', 'B', 'B', 'B', 'B', 'B', 'B', 'B', 'B', 'C', 'C', 'C', 'C', 'C', 'C', 'C', 'C', 'C'], 'value1': [0.1, 0.244, 0.373, 0.514, 0.663, 0.786, 0.902, 1.01, 1.151, 1.295, 1.434, 1.541, 1.679, 1.793, 1.94, 2.049, 2.164, 2.284, 2.432, 2.533, 2.68, 2.786, 2.906, 3.008, 3.136], 'value2': ['Dept1', 'Dept2', 'Dept3', 'Dept4', 'Dept5', 'Dept6', 'Dept7', 'Dept8', 'Dept9', 'Dept10', 'Dept11', 'Dept12', 'Dept13', 'Dept14', 'Dept15', 'Dept16', 'Dept17', 'Dept18', 'Dept19', 'Dept20', 'Dept21', 'Dept22', 'Dept23', 'Dept24', 'Dept25'], 'desired_output':['0.589', '0.589', '0.589', '0.518', '0.444', '0.444', '0.444', '1.61', '1.61', '1.61', '1.61', '1.557', '1.488', '1.488', '1.488', '1.488', '2.733', '2.733', '2.733', '2.733', '2.66', '2.607', '2.607', '2.607', '2.607'] })
我试过这个代码,但返回了一个错误,提示“变换函数对数据类型无效”:
df['desired_output2'] = df.groupby(['key'], as_index = False)['value1'].transform(lambda x: [x[(v['value2'] != x['value2'])].median() for v in x])
我觉得用分组和循环的方式应该可以做到这一点,但我就是写不对语法。
1 个回答
0
试试这个:
df["value3"] = df.groupby("key")["value1"].transform(
lambda x: [x[x.index != i].median() for i in x.index]
)
print(df)
输出结果是:
key value1 value2 desired_output value3
0 A 0.100 Dept1 0.589 0.5885
1 A 0.244 Dept2 0.589 0.5885
2 A 0.373 Dept3 0.589 0.5885
3 A 0.514 Dept4 0.518 0.5180
4 A 0.663 Dept5 0.444 0.4435
5 A 0.786 Dept6 0.444 0.4435
6 A 0.902 Dept7 0.444 0.4435
7 B 1.010 Dept8 1.61 1.6100
8 B 1.151 Dept9 1.61 1.6100
9 B 1.295 Dept10 1.61 1.6100
10 B 1.434 Dept11 1.61 1.6100
11 B 1.541 Dept12 1.557 1.5565
12 B 1.679 Dept13 1.488 1.4875
13 B 1.793 Dept14 1.488 1.4875
14 B 1.940 Dept15 1.488 1.4875
15 B 2.049 Dept16 1.488 1.4875
16 C 2.164 Dept17 2.733 2.7330
17 C 2.284 Dept18 2.733 2.7330
18 C 2.432 Dept19 2.733 2.7330
19 C 2.533 Dept20 2.733 2.7330
20 C 2.680 Dept21 2.66 2.6595
21 C 2.786 Dept22 2.607 2.6065
22 C 2.906 Dept23 2.607 2.6065
23 C 3.008 Dept24 2.607 2.6065
24 C 3.136 Dept25 2.607 2.6065