如何从同一列中读取数据中的两行来创建该列中的值的组合?

2024-10-06 12:40:07 发布

您现在位置:Python中文网/ 问答频道 /正文

在以下数据中:

M1  M2  M3  M4  M5  M6  M7  M8  Hx Hy    S1    S2    S3    S4
A   T   T   A   A   G   A   C   A   C    C     G     C     T
A   T   T   A   A   G   A   C   A   C    C     G     C     T
T   G   C   T   G   T   T   G   T   A    A     T     A     T
C   A   A   C   A   G   T   C   C   G    G     A     C     G
G   T   G   T   A   T   C   T   G   T    C     T     T     T

使用了以下代码:

d1 = d1.add('g').add(d1.shift()).dropna()

要获得:

M1   M2   M3   M4   M5   M6   M7   M8   H0   H1   S1   S2   S3   S4                                                                         
AgA  TgT  TgT  AgA  AgA  GgG  AgA  CgC  AgA  CgC  CgC  GgG  CgC  TgT   
TgA  GgT  CgT  TgA  GgA  TgG  TgA  GgC  TgA  AgC  AgC  TgG  AgC  TgT   
CgT  AgG  AgC  CgT  AgG  GgT  TgT  CgG  CgT  GgA  GgA  AgT  CgA  GgT   
GgC  TgA  GgA  TgC  AgA  TgG  CgT  TgC  GgC  TgG  CgG  TgA  TgC  TgG 

但是,如果数据具有以下结构:

M1   M2   M3  M4     Hx  Hy   S1  S2        pos  
A/T  T/A  A/G  G/G    A    C    C/G  C/T    2
A/T  T/A  A/G  G/G    G    T    C/G  C/T    12
T/G  C/T  G/T  T/G    C    G    T/T  T/T    16
T/T  T/T  T/T  T|T    G    T    T/T  T/T    17

相反,我希望每个列的所有可能字母(在前一行和当前行之间)的组合,除了pos。你知道吗

所以,它就像:

M1                M2               Hx    Hy      S1                S2                                               
AgA,AgT,TgA,TgT  TgT,TgA,AgT,AgA   AgA   TgC   CgC,CgG,GgC,GgG    CgC,CgT,TgC,TgT
TgA,TgT,GgA,GgT ....
so on for all other line

我添加了一个矩阵来理解这个过程:

values from previous line in m1 (at pos 12)
                                  A       T
value from next            T     TgA     TgT
next line  pos 16 ->       G     GgA     GgT

我尝试使用itertools将每行中的值保留为字典列表:

for row in d1_group.iterrows():
    index, data = row
    temp.append(data.tolist())
print(temp)

接下来,要考虑的是使用index(或pos)作为键,然后在相邻的index(或pos)值之间创建组合。你知道吗

有没有可能用熊猫或字典来做这件事。你知道吗

谢谢你


Tags: posd1tgts2s1m1m2cgc
1条回答
网友
1楼 · 发布于 2024-10-06 12:40:07

前言:

import itertools as it

list(it.product(['A'], ['T']))
Out[229]: [('A', 'T')]

list(it.product(['A', 'T'], ['T', 'G']))
Out[230]: [('A', 'T'), ('A', 'G'), ('T', 'T'), ('T', 'G')]

','.join('g'.join(t) for t in it.product(['A'], ['T']))
Out[231]: 'AgT'

','.join('g'.join(t) for t in it.product(['T', 'G'],['A', 'T']))
Out[233]: 'TgA,TgT,GgA,GgT'

因此,让我们构建一个包含以下内容的数据帧:

df=df.applymap(lambda c: [[c]])

df
Out[258]: 
      M1     M2     M3     M4     M5     M6     M7     M8     Hx     Hy  \
0  [[A]]  [[T]]  [[T]]  [[A]]  [[A]]  [[G]]  [[A]]  [[C]]  [[A]]  [[C]]   
1  [[A]]  [[T]]  [[T]]  [[A]]  [[A]]  [[G]]  [[A]]  [[C]]  [[A]]  [[C]]   
2  [[T]]  [[G]]  [[C]]  [[T]]  [[G]]  [[T]]  [[T]]  [[G]]  [[T]]  [[A]]   
3  [[C]]  [[A]]  [[A]]  [[C]]  [[A]]  [[G]]  [[T]]  [[C]]  [[C]]  [[G]]   
4  [[G]]  [[T]]  [[G]]  [[T]]  [[A]]  [[T]]  [[C]]  [[T]]  [[G]]  [[T]]  

(df+df.shift(1)).dropna(how='all').applymap(lambda c: ','.join('g'.join(t)
                                                      for t in it.product(*c)))
Out[266]: 
    M1   M2   M3   M4   M5   M6   M7   M8   Hx   Hy   S1   S2   S3   S4
1  AgA  TgT  TgT  AgA  AgA  GgG  AgA  CgC  AgA  CgC  CgC  GgG  CgC  TgT
2  TgA  GgT  CgT  TgA  GgA  TgG  TgA  GgC  TgA  AgC  AgC  TgG  AgC  TgT
3  CgT  AgG  AgC  CgT  AgG  GgT  TgT  CgG  CgT  GgA  GgA  AgT  CgA  GgT
4  GgC  TgA  GgA  TgC  AgA  TgG  CgT  TgC  GgC  TgG  CgG  TgA  TgC  TgG

现在,对于那些只需多做一点清理/准备的夫妇来说,情况也是如此:

df.set_index('pos', inplace=True)

df
Out[273]: 
      M1   M2   M3   M4 Hx Hy   S1   S2
pos                                    
2    A/T  T/A  A/G  G/G  A  C  C/G  C/T
12   A/T  T/A  A/G  G/G  G  T  C/G  C/T
16   T/G  C/T  G/T  T/G  C  G  T/T  T/T
17   T/T  T/T  T/T  T|T  G  T  T/T  T/T

df = df.applymap(lambda c: [c.split('/')])
df
Out[274]: 
           M1        M2        M3        M4     Hx     Hy        S1        S2
pos                                                                          
2    [[A, T]]  [[T, A]]  [[A, G]]  [[G, G]]  [[A]]  [[C]]  [[C, G]]  [[C, T]]
12   [[A, T]]  [[T, A]]  [[A, G]]  [[G, G]]  [[G]]  [[T]]  [[C, G]]  [[C, T]]
16   [[T, G]]  [[C, T]]  [[G, T]]  [[T, G]]  [[C]]  [[G]]  [[T, T]]  [[T, T]]
17   [[T, T]]  [[T, T]]  [[T, T]]   [[T|T]]  [[G]]  [[T]]  [[T, T]]  [[T, T]]



(df+df.shift(1)).dropna(how='all').applymap(lambda c: ','.join('g'.join(t) for t in it.product(*c)))
Out[276]: 
                  M1               M2               M3               M4   Hx  \
pos                                                                            
12   AgA,AgT,TgA,TgT  TgT,TgA,AgT,AgA  AgA,AgG,GgA,GgG  GgG,GgG,GgG,GgG  GgA   
16   TgA,TgT,GgA,GgT  CgT,CgA,TgT,TgA  GgA,GgG,TgA,TgG  TgG,TgG,GgG,GgG  CgG   
17   TgT,TgG,TgT,TgG  TgC,TgT,TgC,TgT  TgG,TgT,TgG,TgT      T|TgT,T|TgG  GgC   

      Hy               S1               S2  
pos                                         
12   TgC  CgC,CgG,GgC,GgG  CgC,CgT,TgC,TgT  
16   GgT  TgC,TgG,TgC,TgG  TgC,TgT,TgC,TgT  
17   TgG  TgT,TgT,TgT,TgT  TgT,TgT,TgT,TgT  

现在可以重置索引并返回pos。您可能需要通过移动和适当对齐来进行调整。你知道吗

相关问题 更多 >