Python 如何从同一列中读取数据中的两行以创建该列中的值的组合?
在以下数据中:Python 如何从同一列中读取数据中的两行以创建该列中的值的组合?,python,pandas,numpy,dictionary,itertools,Python,Pandas,Numpy,Dictionary,Itertools,在以下数据中: 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
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
for row in d1_group.iterrows():
index, data = row
temp.append(data.tolist())
print(temp)
我添加了一个矩阵来了解流程:
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将每行中的值作为字典列表保存:
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
for row in d1_group.iterrows():
index, data = row
temp.append(data.tolist())
print(temp)
接下来,我们考虑使用索引(或pos)作为键,然后在相邻的索引(或pos)值之间创建组合
有没有可能用熊猫或字典来做这件事
谢谢,序言部分:
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
。您可能需要通过移动和适当对齐来进行调整。感谢@Boud提供全面的详细信息。但是,有时会有管道(|)
作为分隔符。在这种情况下,不会有组合,而是使用指数位置的直线组合。例如,M4位置16处的T/T
和M4位置17处的T
将只需要TgT和TgG
。我会试着自己解决这个问题来解决这个问题。如果情况发生,我会打电话寻求帮助。