Python 按以平均值为中心的标准偏差对列值进行分类?
我有一个熊猫数据框,其中有一组按排序的值:Python 按以平均值为中心的标准偏差对列值进行分类?,python,numpy,pandas,dataframe,vectorization,Python,Numpy,Pandas,Dataframe,Vectorization,我有一个熊猫数据框,其中有一组按排序的值: df = pd.DataFrame(np.arange(1,21)) 我希望最终得到如下列表/数组: [0,1.62,4.58,7.54,10.5,13.45,16.4,19.37,20] 第一个和最后一个元素是df.min()和df.max(),中心元素是数据帧的df.mean(),周围的元素都以0.5*df.std()的增量递增 有没有办法对大型数据帧进行矢量化 更新(有效的方法在下面的答案中!) 然后使用np.digitalize()将值移动
df = pd.DataFrame(np.arange(1,21))
我希望最终得到如下列表/数组:
[0,1.62,4.58,7.54,10.5,13.45,16.4,19.37,20]
第一个和最后一个元素是df.min()
和df.max()
,中心元素是数据帧的df.mean()
,周围的元素都以0.5*df.std()的增量递增
有没有办法对大型数据帧进行矢量化
更新(有效的方法在下面的答案中!)
然后使用np.digitalize()
将值移动到适当的存储箱中
如果你能找到一个更有效的方法,那会很有帮助的 mu_sig
通过将[-2,-1,0,1,2]
乘以sigma来计算标准偏差的各种倍数
edges
获取序列并获得mu_sig
结果。然后检查序列最小值是否小于标准偏差减去平均值的最小倍数。如果是,则在列表前加上前缀。对max执行相同的检查
def edges(s, n=7, rnd=2, sig_mult=1):
mu = s.mean()
sig = s.std()
mn = s.min()
mx = s.max()
sig = np.arange(-n // 2, (n + 1) // 2 + 1) * sig * sig_mult
ms = (mu + sig)
# Checking if mins and maxs are in range of sigs
if mn < ms.min():
ms = np.concatenate([[mn], ms])
if mx > max(ms):
ms = np.concatenate([ms, [mx]])
return ms.round(rnd).tolist()
然后使用边
这是你的答案
默认情况下,这将返回长度为11的列表。您可以传递n
以获得不同长度的列表
edges(s, n=3)
[1, -1.33, 4.58, 10.5, 16.42, 22.33, 20]
预计您可能希望将其更改为标准偏差的不同倍数,您还可以执行以下操作:
edges(df, n=3, sig_mult=.2)
[1, 8.13, 9.32, 10.5, 11.68, 12.87, 20]
时机
长度为20的系列
长度为1000000的系列
共享你的循环实现?@Divakar,添加了代码示例不确定我是否假设了错误,但代码没有运行,是吗?在:if x>df.min():
处抛出错误?是的,我意识到这是一个糟糕的代码,然后到控制台进行测试。太差劲了,无法跟上,所以我删除了它,并将在下次有机会时添加到问题中:/对不起@对不起,那是个愚蠢的打字错误。你能看看我提出的最新解决方案,看看是否有意义吗?
edges(s, sig_mult=.5, n=5)
[1, 1.63, 4.58, 7.54, 10.5, 13.46, 16.42, 19.37, 20]
edges(s)
[1, -13.16, -7.25, -1.33, 4.58, 10.5, 16.42, 22.33, 28.25, 34.16, 20]
edges(s, n=3)
[1, -1.33, 4.58, 10.5, 16.42, 22.33, 20]
edges(df, n=3, sig_mult=.2)
[1, 8.13, 9.32, 10.5, 11.68, 12.87, 20]