基于聚合和当前记录排除的python中位数

问题描述 投票:0回答:1

我想添加一个新列,它反映基于键值的 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 应该适用于此,但无法获得正确的语法。

python lambda group-by
1个回答
0
投票

尝试:

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
© www.soinside.com 2019 - 2024. All rights reserved.