Dans cet ensemble de données suivant (mcve_01.txt):Comment exécuter le produit itertools pour la liste donnée en supprimant un élément spécifique dans la liste?
mcve_01.txt
pos M1 M2 F1_x F1_y Sk1 S2 Sj
16230484 G/G G/G G T T/T T/T T/T
16230491 C/C C/C C T T/T . T/T
16230503 T/T T/T T T T/T . T/T
16230524 T/T T/T T A A/A A/A A/A
16230535 . . T C . . .
16232072 A/A A/A A G G/G G/G G/G
16232072 A/A A/A A G G/G G/G G/G
16229783 C/C C/C G C G/C G/C C|G
16229992 A/A A/A G A A/A A/A A|G
16230007 T/T T/T A T A|T A|T A|T
16230011 G/G G/G C G C|G C|G G/C
16230049 A/A A/A T A . A/T A/T
16230174 . . T C T|C T|C C|T
16230190 A/A A/A T A G|T T|G T|G
16230260 A/A A/A G A G/G G/G G/G
16230260 A/A A/A G A G/G G/G G/G
16232772 A/A A/A C A C/C C/C C/C
16232793 C/C C/C T C T/T T/T T/T
16232793 C/C C/C T C T/T T/T T/T
16232282 T/T T/T T A A/A A/A A/A
Je suis en train de lancer un modèle de Markov.
est mon code ci-dessous:
import pandas as pd
import itertools as it
mcve_data = pd.read_csv('mcve_01.txt', sep='\t')
mcve_data.set_index(['pos'], inplace = True)
mcve_list = mcve_data.applymap(lambda c:[list(c)])
Note: Je dois convertir les valeurs dans chaque colonne à la liste que je peux exécuter le zip ou obligé itertools.product en fonction de la condition.
def mapfun(c):
cstr = ''.join(map(str, c))
if '.' in cstr:
return '.'
if '/' in cstr:
sep = '/'
fun = it.product
else:
sep = '|'
fun = zip
return ','.join('g'.join(t) for t in fun(*c) if sep not in t)
Maintenant (ci-dessous), appliquez la fonction de modélisation markov.
mcve_mm = (mcve_list+mcve_list.shift(1)).dropna(how='all').\
applymap(mapfun)
Note: Donc, dans le code ci-dessus (mcve_list+mcve_list.shift(1))
lit les valeurs de deux lignes de la même colonne pour appliquer la chaîne markov.
print(mcve_mm)
pd.DataFrame.to_csv(mcve_mm, 'mcve_mm.txt', sep='\t', index=True)
La sortie (mcve_mm.txt) est:
pos M1 M2 F1_x F1_y Sk1 S2 Sj
16230491 CgG,CgG,CgG,CgG CgG,CgG,CgG,CgG CgG TgT TgT,TgT,TgT,TgT . TgT,TgT,TgT,TgT
16230503 TgC,TgC,TgC,TgC TgC,TgC,TgC,TgC TgC TgT TgT,TgT,TgT,TgT . TgT,TgT,TgT,TgT
16230524 TgT,TgT,TgT,TgT TgT,TgT,TgT,TgT TgT AgT AgT,AgT,AgT,AgT . AgT,AgT,AgT,AgT
16230535 . . TgT CgA . . .
16232072 . . AgT GgC . . .
16232072 AgA,AgA,AgA,AgA AgA,AgA,AgA,AgA AgA GgG GgG,GgG,GgG,GgG GgG,GgG,GgG,GgG GgG,GgG,GgG,GgG
16229783 CgA,CgA,CgA,CgA CgA,CgA,CgA,CgA GgA CgG GgG,GgG,CgG,CgG GgG,GgG,CgG,CgG CgG,CgG,|gG,|gG,GgG,GgG
16229992 AgC,AgC,AgC,AgC AgC,AgC,AgC,AgC GgG AgC AgG,AgC,AgG,AgC AgG,AgC,AgG,AgC AgC,GgG
16230007 TgA,TgA,TgA,TgA TgA,TgA,TgA,TgA AgG TgA AgA,AgA,|gA,|gA,TgA,TgA AgA,AgA,|gA,|gA,TgA,TgA AgA,TgG
16230011 GgT,GgT,GgT,GgT GgT,GgT,GgT,GgT CgA GgT CgA,GgT CgA,GgT GgA,Gg|,GgT,CgA,Cg|,CgT
16230049 AgG,AgG,AgG,AgG AgG,AgG,AgG,AgG TgC AgG . AgC,Ag|,AgG,TgC,Tg|,TgG AgG,AgC,TgG,TgC
16230174 . . TgT CgA . TgA,TgT,|gA,|gT,CgA,CgT CgA,CgT,|gA,|gT,TgA,TgT
16230190 . . TgT AgC GgT,TgC TgT,GgC TgC,GgT
16230260 AgA,AgA,AgA,AgA AgA,AgA,AgA,AgA GgT AgA GgG,Gg|,GgT,GgG,Gg|,GgT GgT,Gg|,GgG,GgT,Gg|,GgG GgT,Gg|,GgG,GgT,Gg|,GgG
16230260 AgA,AgA,AgA,AgA AgA,AgA,AgA,AgA GgG AgA GgG,GgG,GgG,GgG GgG,GgG,GgG,GgG GgG,GgG,GgG,GgG
16232772 AgA,AgA,AgA,AgA AgA,AgA,AgA,AgA CgG AgA CgG,CgG,CgG,CgG CgG,CgG,CgG,CgG CgG,CgG,CgG,CgG
16232793 CgA,CgA,CgA,CgA CgA,CgA,CgA,CgA TgC CgA TgC,TgC,TgC,TgC TgC,TgC,TgC,TgC TgC,TgC,TgC,TgC
16232793 CgC,CgC,CgC,CgC CgC,CgC,CgC,CgC TgT CgC TgT,TgT,TgT,TgT TgT,TgT,TgT,TgT TgT,TgT,TgT,TgT
16232282 TgC,TgC,TgC,TgC TgC,TgC,TgC,TgC TgT AgC AgT,AgT,AgT,AgT AgT,AgT,AgT,AgT AgT,AgT,AgT,AgT
Donc, il y a plusieurs sorties froussard dans le fichier de sortie. Quelque chose de similaire à GgG,Gg|,GgT,GgG,Gg|,GgT
dans la ligne 16230260. J'essaie de me débarrasser de ce genre de problème.
Le problème est avec le code à:
if '/' in cstr:
sep = '/'
fun = it.product
quand est quelque chose comme le c (liste):
if '/' in cstr:
print(c)
print(type(c))
sep = '/'
fun = it.product
Certains des c (lire deux lignes en raison de changement) ont la structure suivante qui je pense est le problème.
[['C', '|', 'G'], ['G', '/', 'G']]
<class 'list'>
Ainsi, le it.product multiplie la barre verticale (|) avec le reste des éléments dans l'autre liste.
a essayé:
if '/' in cstr:
for x in c:
while '|' in x:
x.remove('|')
# but I think this is not updating c but sometimes affecting the c in other columns by borrowing the condition met from previous line.
sep = '/'
fun = it.product
J'ai aussi essayé:
for x in c:
while '|' in x:
c == list(''.join(x).strip('|') for x in c)
pour convertir la liste à la chaîne et puis dénuder la barre verticale (|) puis reconvertir en liste, mais a rencontré une erreur.
Ainsi, le problème est: Comment puis-je supprimer la barre verticale (|) en cas de la c lorsque it.product en cours d'exécution pour les lignes/c aime:
[['C', '|', 'G'], ['G', '/', 'G']]
<class 'list'>
La sortie attendue pour les types de c suivants:
[['C', '|', 'G'], ['G', '/', 'G']]
ou [['C', '/', 'G'], ['G', '/', 'G']]
est le même: CgG, CgG, GgG, GgG
peut-il être ajouté à 'def mapfun (c):' though. Je suis entrain de penser à ça, comment? – everestial007
Oui - Si je comprends bien votre objectif, vous voudrez remplacer 'fun = it.product' par' fun = my_product' –
Laissez-moi essayer cela très rapidement. – everestial007