【问题标题】:Sliding window calculation with a step size in python在python中使用步长计算滑动窗口
【发布时间】:2020-09-19 05:39:32
【问题描述】:

我有使用 pandas 的这些数据:

SNP = pd.read_csv("C:/Users/sia/Desktop/SNP.txt",delimiter=r"\s+",header=0)
ID Chr Position p
M1  1   4762    0.40
M2  1   77143   0.62
M3  1   130756  0.22
M4  1   227358  0.50
M5  1   265131  0.60
M6  1   568128  0.64
M7  2   2000    0.32
M8  2   18000   0.36
M9  2   60300   0.64
M10 2   71118   0.50
M11 2   71595   0.28
M12 2   200000  0.10

在 python 中,如何根据新数据框中每个 Chr 的位置列中的滑动窗口 (100000) 和步长 (50000) 得到 p 值的总和,如下所示:

   Chr  start   end     sum.p.slide
    1   0       100000  1.02
    1   50000   150000  0.84
    1   100000  200000  0.22
    1   150000  250000  0.50
    1   200000  300000  1.10
    1   250000  350000  0.60
    1   300000  400000  Na
    1   350000  450000  Na
    1   400000  500000  Na
    1   450000  550000  Na
    1   500000  600000  0.64
    2   0       100000  2.1
    2   50000   150000  Na
    2   100000  200000  0.1

【问题讨论】:

  • 请格式化您的数据,它没有对齐。如果您发布一些起始代码,您也会很高兴。这看起来像是一个非常不费力的帖子,你可以做得更好。来自review
  • 感谢您的评论!抱歉,这是我的第一个问题。

标签: python python-3.x pandas python-2.7 numpy


【解决方案1】:

我敢肯定有更好的方法来做到这一点,但你去吧。

df['range1'] = pd.cut(df.Position, [x for x in range(0, df.Position.max()+100000,100000)])
df['range2'] = pd.cut(df.Position, [x for x in range(50000, df.Position.max()+50000,100000)])

a = df[['range1','Chr','p']].groupby(['Chr','range1']).agg({'p':sum})
b = df[['range2','Chr','p']].groupby(['Chr','range2']).agg({'p':sum})


out = pd.concat([a,b], axis=1).fillna(np.nan).sum(axis=1).replace(0.0, np.nan).reset_index()

out['start'] = out.level_1.apply(lambda x:x.left)
out['end'] = out.level_1.apply(lambda x:x.right)

out.drop(columns=['level_1'], inplace=True)

out.columns = ['Chr','sum.p.silde','start','end']

out[['Chr','start','end','sum.p.silde']]

输出

    Chr start   end     sum.p.silde
0   1   0       100000  1.02
1   1   50000   150000  0.84
2   1   100000  200000  0.22
3   1   150000  250000  0.50
4   1   200000  300000  1.10
5   1   250000  350000  0.60
6   1   300000  400000  NaN
7   1   350000  450000  NaN
8   1   400000  500000  NaN
9   1   450000  550000  NaN
10  1   500000  600000  0.64
11  2   0       100000  2.10
12  2   50000   150000  1.42
13  2   100000  200000  0.10
14  2   150000  250000  0.10
15  2   200000  300000  NaN
16  2   250000  350000  NaN
17  2   300000  400000  NaN
18  2   350000  450000  NaN
19  2   400000  500000  NaN
20  2   450000  550000  NaN
21  2   500000  600000  NaN

【讨论】:

  • 实际上,Chrs 是染色体数,我想计算每个染色体的滑动窗口值。所以范围应该从每条染色体开始。
  • 感谢您的代码!我不知道为什么它适用于某些范围,但不适用于所有范围。我猜你没有考虑到Chrs。这些值应分别计算每个 Chr。例如,Chr 1 中 50000-150000 范围内 p 值的总和应为 0.84 (0.62+0.22)。
  • 你好克里斯,我还有一个问题。如何计算第一个表中每个窗口的 ID?
  • 另外,我使用更大的数据集执行了您的脚本,但我遇到了 IndexError: index 15903 is out of bounds for axis 0 with size 2743 for out = pd.concat([a,b], axis =1).fillna(np.nan).sum(axis=1).replace(0.0, np.nan).reset_index()
猜你喜欢
  • 2017-07-16
  • 2018-08-27
  • 1970-01-01
  • 2023-01-29
  • 2015-12-16
  • 2020-07-05
  • 2018-06-05
  • 2011-01-10
  • 2017-03-12
相关资源
最近更新 更多