基于聚合和当前记录排除的Python中位数计算

1 投票
1 回答
25 浏览
提问于 2025-04-14 18:03

我想添加一个新列,这个列的值是根据某个关键值分组后计算出的中位数,但在计算中位数的时候要排除掉每条记录自己。

下面是一个数据示例,以及我希望得到的输出结果:

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

撰写回答