gpt4 book ai didi

python - 如何找到不同大小列表的中位数

转载 作者:行者123 更新时间:2023-12-01 08:34:32 31 4
gpt4 key购买 nike

我有一个数字列表,我想将其分类到垃圾箱中并找到每个垃圾箱的中位数。如果所有 bin 都具有相同数量的数据点,则使用 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]])

每个 bin 的中位数是:

np.median(binned, axis=1)

结果:

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

但是,如果列表中每个箱中有不同数量的点(或某些箱中没有点),我无法创建 numpy 数组或使用 np.median ,而是必须执行以下操作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 循环)?

最佳答案

只需将两列放入 pandas DataFrame 中,您就可以通过按“索引”分组轻松计算中位数。让我们在实践中看看:

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

关于python - 如何找到不同大小列表的中位数,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/53788625/

31 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com