【发布时间】: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