pandas 如何对数据框中的列进行求和,该值范围内的行在指定间隔内增加?

cbjzeqam  于 2023-08-01  发布在  其他
关注(0)|答案(2)|浏览(97)

编辑:我在实际数据上尝试了下面的代码,我得到了第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[]函数,但是在增量窗口中循环多个染色体时遇到了麻烦

vuv7lop3

vuv7lop31#

我不确定你是否正在寻找这样的东西。由于您的示例数据不可复制,我从您共享的示例中创建了一个。

import pandas as pd

df = pd.DataFrame({
    'Col1': ['String' + str(i) for i in range(1, 21)],
    'Col2': range(1, 21),
    'Col3': np.random.rand(20)
})

conditions  = [df['Col2'].between(1,5), df['Col2'].between(6,10),
               df['Col2'].between(11,15), df['Col2'].between(16,20)]
choices     = [ "group1", "group2", "group3", "group4" ]
    
df["class"] = np.select(conditions, choices, default='random_group')
df["class_sum"] = df.groupby(['Col1' ,"class"])['Col3'].transform('sum')
print(df)

 Col1  Col2      Col3   class  class_sum
0    String1     1  0.509723  group1   0.509723
1    String2     2  0.387798  group1   0.387798
2    String3     3  0.106302  group1   0.106302
3    String4     4  0.576913  group1   0.576913
4    String5     5  0.068705  group1   0.068705
5    String6     6  0.802236  group2   0.802236
6    String7     7  0.511529  group2   0.511529
7    String8     8  0.846700  group2   0.846700
8    String9     9  0.785276  group2   0.785276
9   String10    10  0.912042  group2   0.912042
10  String11    11  0.607900  group3   0.607900
11  String12    12  0.842794  group3   0.842794
12  String13    13  0.779911  group3   0.779911
13  String14    14  0.964896  group3   0.964896
14  String15    15  0.983164  group3   0.983164
15  String16    16  0.753229  group4   0.753229
16  String17    17  0.739145  group4   0.739145
17  String18    18  0.915821  group4   0.915821
18  String19    19  0.338980  group4   0.338980
19  String20    20  0.698161  group4   0.698161

字符串

uqjltbpv

uqjltbpv2#

您可以使用cutgroupby.sum

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(df['position'], bins, labels=labels).astype(str)

out = (df.groupby(['chromosome', group, 'strand'])
       [['A', 'B', 'C', 'D']].sum().reset_index()
      )

字符串
或者,使用floordiv计算组:

s = df['position'].floordiv(10_000).add(1)
group = s.astype(str)+'-'+s.mul(10_000).astype(str)

out = (df.groupby(['chromosome', group, 'strand'])
       [['A', 'B', 'C', 'D']].sum().reset_index()
      )


输出量:

chromosome position strand  A  B  C  D
0       ChrA  1-10000      F  4  5  2  8
1       ChrB  1-10000      F  1  1  0  4


使用的输入:

chromosome  position strand  A  B  C  D
0       ChrA       553      F  3  0  0  0
1       ChrA       834      F  0  3  1  0
2       ChrA       987      F  1  2  1  8
3       ChrB       348      F  1  1  0  4

相关问题