【问题标题】:Binning pandas/numpy array/dataframe of zscores对 z 分数的 pandas/numpy 数组/数据框进行分箱
【发布时间】:2018-03-31 22:23:55
【问题描述】:

我有一个 Z 分数的 pandas 数据框。所以,负和正 np.float64 的。我已删除所有 [-1.0, 1.0] 值,因此示例如下: REF ?|100133144 ?|100134869 ?|10357 ?|10431 A41B-07 0.000 0.0 0.0 1.010 A41B-07 1.497 0.0 0.0 -1.139 A41B-07 0.000 0.0 0.0 1.492 A41B-07 2.300 0.0 0.0 1.310 A41B-07 0.000 0.0 0.0 -1.262 A41B-07 0.000 0.0 0.0 1.283 A41B-07 -1.396 0.0 0.0 1.409 A41B-07 -1.243 0.0 0.0 -1.509 A144-07 0.000 0.0 0.0 1.200 A115-07 0.000 0.0 0.0 1.359

我想离散化这些值以运行 LDA,所以我需要整数。将高于 +1.0 的正 z 分数分到 10 个分档中,以每列为基础。然后对于低于-1.0的负数也是如此。因此,对于每一列,bin 范围是 max z 到 min z。把它均匀地切成10个箱子。请注意,这些是单独的范围,因此同一列中的正负数不同。 0.0 值保持不变。由于 bin 数是正数,因此正数和负数都将映射到正整数。因此,您会期待以下内容。请注意,我只是输入了整数,这些只是为了演示。

REF ?|100133144 ?|100134869 ?|10357 ?|10431 A41B-07 0.000 0.0 0.0 1 A41B-07 1 0.0 0.0 1 A41B-07 0.000 0.0 0.0 10 A41B-07 10 0.0 0.0 6 A41B-07 0.000 0.0 0.0 3 A41B-07 0.000 0.0 0.0 2 A41B-07 10 0.0 0.0 8 A41B-07 1 0.0 0.0 10 A144-07 0.000 0.0 0.0 2 A115-07 0.000 0.0 0.0 3

这是我极其丑陋的尝试。它不运行。我玩这个已经超过 15 小时了,我对做任何事情都束手无策。

for gene in data:
    max_pos = data[data >= 0.0][gene].max(skipna=True)
    min_pos = data[data >= 1.0][gene].min(skipna=True)
    max_neg = data[data <= -1.0][gene].min(skipna=True)
    min_neg = data[data <= -1.0][gene].max(skipna=True)
    pos_bins = neg_bins = []
    pos = False
    neg = False

    if (max_pos != min_pos) and (not math.isnan(max_pos)) and (not math.isnan(min_pos)):
        pos_bins = np.linspace(min_pos, max_pos, num=10, endpoint=False)
        pos = True
    if (max_neg != min_neg) and (not math.isnan(min_neg)) and (not math.isnan(min_neg)):
        neg_bins = np.linspace(min_neg, max_neg, num=10, endpoint=False)
        neg = True

    if pos:
        data[gene] = pd.np.digitize(data[data >= +1.0][gene], pos_bins, right=True)
    if neg:
        data[gene] = pd.np.digitize(data[data <= -1.0][gene], neg_bins, right=True)

任何指针将不胜感激!

【问题讨论】:

  • 为了确保我理解,这是对您要求的良好解释吗?对于每一列:对于正负 z-scores 单独:将每个 z-score 的绝对值放入 10 个等宽的 bin 中,然后输出每个 bin 的索引(从 1 开始)分数落入。
  • 是的,这实际上是一个很好的释义。我在下面找到了一个可行的解决方案,虽然可能不是想法。

标签: python arrays pandas numpy binning


【解决方案1】:

朋友最终提供了一个导致此解决方案的想法

def binx(x, max_pos, min_pos, max_neg, min_neg):
    if x >= 1.0:
        if x == min_pos:
            return 1.0
        elif x == max_pos:
            return 10.0
        else:
            return ((x - min_pos) / (max_pos - min_pos) * 10) + 1
    elif x <= -1.0:
        if x == min_neg:
            return 1.0
        elif x == max_neg:
            return 10.0
        else:
            return ((x - min_neg) / (max_neg - min_neg) * 10) + 1
    else:
        return x
...
...
...
for gene in data:
    max_pos = data[data >= 1.0][gene].max(skipna=True)
    min_pos = data[data >= 1.0][gene].min(skipna=True)
    max_neg = data[data <= -1.0][gene].min(skipna=True)
    min_neg = data[data <= -1.0][gene].max(skipna=True)

    data[gene] = data[gene].apply(lambda x: binx(x, max_pos, min_pos, max_neg, min_neg))
    data = data.astype(np.int64)

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 2021-06-03
    • 2018-12-30
    • 2013-06-01
    • 2022-12-09
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多