我想添加一个新列,它反映基于键值的 value1 分组计算出的中位数,但从中位数计算中排除每个记录本身。
下面是我想要的输出的数据示例:
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'], '值 1': [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], '值2': ['部门1', '部门2', '部门3', '部门4', '部门5', '部门6', '部门 7'、'部门 8'、'部门 9'、'部门 10'、'部门 11'、'部门 12'、'部门 13'、'部门 14'、'部门 15'、'部门 16'、'部门 17'、'部门 18'、'部门 19' , '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])
我认为带有循环 lambda 的 groupby 应该适用于此,但无法获得正确的语法。
尝试:
df["value3"] = df.groupby("key", group_keys=False)["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