如何求不同表的中值

2024-03-28 09:59:47 发布

您现在位置:Python中文网/ 问答频道 /正文

我有一个数字列表,我想把它们分类到箱子里,找到每个箱子的中位数。如果所有的箱子都有相同数量的数据点,那么使用numpy数组就很容易做到这一点:

import numpy as np    
indices=np.array([0,1,0,1,1,2,3,3,3,2,0,2])
length=np.max(indices)+1
data = np.arange(len(indices))
binned = np.array([data[indices == i] for i in range(length)])

装箱数据(在数组binned中)然后

array([[ 0,  2, 10],
   [ 1,  3,  4],
   [ 5,  9, 11],
   [ 6,  7,  8]])

每个箱子的中位数为:

np.median(binned, axis=1)

结果:

array([2., 3., 9., 7.])

但是,如果列表中每个bin中的点数不同(或者某些bin中没有点数),则无法创建numpy数组或使用np.中位数相反,我们必须在一个for循环中完成繁重的工作:

indices=np.array([0,1,1,1,3,1,1,0,0,0,3])
data = np.arange(len(indices))

装箱数据为

[data[indices == i] for i in range(length)]

[array([0, 7, 8, 9]),
 array([1, 2, 3, 5, 6]),
 array([], dtype=int64),
 array([ 4, 10])]

但我不能取数组列表的中位数。相反,我能做到

[np.median(data[indices == i]) for i in range(length)]

然后得到

[7.5, 3.0, nan, 7.0]

但是for循环非常慢。(我的真实数据中有几百万个数据点和数万或数十万个垃圾箱。)

有没有一种方法可以避免对for循环的严重依赖(甚至完全摆脱for循环)?你知道吗


Tags: 数据innumpy列表fordatanprange
1条回答
网友
1楼 · 发布于 2024-03-28 09:59:47

只需将两列放在pandas数据框中,就可以通过按“索引”分组来轻松计算中间值。让我们在实践中看到:

import numpy as np , pandas as pd

indices = [0,1,1,1,3,1,1,0,0,0,3]
data = np.arange(len(indices))

df = pd.DataFrame({"indices": indices, "data": data}) # Your DataFrame
df.head() # Take a look

    indices data
0   0   0
1   1   1
2   1   2
3   1   3
4   3   4
medians = df.groupby("indices").median()# median for each value of `indices`
medians  
        data
    indices 
    0   7.5
    1   3.0
    3   7.0

# Finding indices with no data point
desired_indices = pd.Series([0, 1, 10, -5, 2])
is_in_index = desired_indices.isin(medians.index)
has_no_data = desired_indices[~ is_in_index]
has_no_data
2    10
3    -5
4     2
dtype: int64

相关问题 更多 >