编辑:我在实际数据上尝试了下面的代码,我得到了第1列的不正确的范围。
MAX_SIZE = 10_000_000 # max chromosome size
bins = list(range(0, MAX_SIZE, 10_000))
bins[0] = 1
labels = [f'{a}-{b}' for a,b in zip(bins, bins[1:])]
group = pd.cut(data[1], bins, labels=labels).astype(str)
out = (data.groupby([0, group, 2])
[[3, 4, 5]].sum().reset_index()
)
字符串
第1列的输出应该是:
1-10000
10001-20000
20001-30000
30001-40000
但我得到了
1-10000
10000-20000
100000-110000
110000-120000
120000-130000
...
original:我有DNA测序数据,我已经Map到整个基因组的特定位点,并返回了一个csv文件,其中包含我将序列Map到特定位点的次数。我有几个样本,我想做的是对染色体位置值范围内的每一列(样本)求和。换句话说,我有这样的数据:
ChrA,553,F,3,0,0,0
ChrA,834,F,0,3,1,0
ChrA,987,F,1,2,1,8
...
ChrB,348,F,1,1,0,4
...
列0是染色体的名称,1是序列Map到的核苷酸位置,3-6是序列Map到4个不同样品的该位置的次数。我想做的是在第1列中取一个值窗口(例如从1到10,000),并将所有落在该范围内的列求和。然后我想把染色体的下一段从10,001到20,000的位置相加,以此类推,直到每条染色体的末端.输出应类似于以下内容:
ChrA,1-10000,F,4,5,2,8
ChrA,10001-20000,F,n,n,n,n,n
ChrA,20001-30000,F,n,n,n,n,n
...
ChrB,1-10000,F,n,n,n,n,n
...
谢谢您的帮助!
我唯一尝试过的是pandas .loc[]函数,但是在增量窗口中循环多个染色体时遇到了麻烦
2条答案
按热度按时间vuv7lop31#
我不确定你是否正在寻找这样的东西。由于您的示例数据不可复制,我从您共享的示例中创建了一个。
字符串
uqjltbpv2#
您可以使用
cut
和groupby.sum
:字符串
或者,使用
floordiv
计算组:型
输出量:
型
使用的输入:
型