【问题标题】:Binning Pandas column values by standard deviation centered on average?按以平均值为中心的标准差对 Pandas 列值进行分箱?
【发布时间】:2016-11-25 16:23:45
【问题描述】:

我有一个 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() 将值移动到适当的容器中。

如果您找到更有效的方法,那将很有帮助!

【问题讨论】:

  • 分享你的循环实现?
  • @Divakar,添加代码示例
  • 不确定我是否假设有问题,但该代码无法运行,是吗?抛出错误:if x > df.min():?
  • 是的,我意识到那是很糟糕的代码,所以才到控制台进行测试。太糟糕了,无法跟上,所以我将其删除,下次有机会时会添加到问题中:/对不起!
  • @piRSquared 抱歉,这是一个愚蠢的错字。你能看看我提出的更新的解决方案,看看是否有意义?

标签: python numpy pandas dataframe vectorization


【解决方案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 的系列

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 2016-05-07
    • 1970-01-01
    • 2021-06-17
    • 1970-01-01
    • 2014-09-28
    • 2019-04-02
    • 2020-12-26
    • 2011-07-23
    相关资源
    最近更新 更多