我有一个Pandas数据框,其中包含一系列按排序顺序排列的值:
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()
的增量
有没有办法对大型DataFrame进行矢量化?
更新(有效的方法在下面的答案中!)
a = np.arange(df[0].mean(),df[0].min(),-0.5*df[0].std())
b = np.arange(df[0].mean(),df[0].max(),0.5*df[0].std())
c = np.concatenate((a,b))
c = np.append(c,[df[0].min(),df[0].max()])
c = np.unique(c)
然后使用np.digitize()
将值移动到适当的分区。
如果您找到更有效的方法,那将会有所帮助!
答案 0 :(得分:1)
mu_sig
通过将[-2, -1, 0, 1, 2]
乘以sigma来计算各种标准偏差。
edges
需要一系列内容并获得mu_sig
个结果。然后检查系列最小值是否小于标准差的最小倍数减去平均值。如果是,则将其添加到列表中。检查最大值
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()
它适用于一系列,因此我会挤压您的数据框
df = pd.DataFrame(np.arange(1,21))
s = df.squeeze()
然后使用edges
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]
默认返回长度为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的系列
系列长度1,000,000