2017-02-09 1 views
2

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

Répondre

2

je suggère de changer la fonction comme suit:

from itertools import product 
from functools import partial 

def mapfun(c): 
    if any(['.' in l for l in c]): 
     return '.' 

    if all(['|' in l for l in c]): 
     fun = zip 
    else: 
     fun = product 

    return ','.join('g'.join(t) for t in fun(*map(mapfun.filt,c))) 

mapfun.filt_set = set(['|','/']) 
mapfun.filt = partial(filter,lambda l: not (l in mapfun.filt_set)) 

print(mapfun([['C', '|', 'G'], ['G', '|', 'G']])) 
print(mapfun([['C', '/', 'G'], ['G', '/', 'G']])) 
print(mapfun([['C', '|', 'G'], ['G', '/', 'G']])) 
print(mapfun([['C', '/', 'G'], ['G', '|', 'G']])) 

Cela donne la sortie:

CgG,GgG 
CgG,CgG,GgG,GgG 
CgG,CgG,GgG,GgG 
CgG,CgG,GgG,GgG 

c.-à-zip est utilisé pour le premier exemple et itertools.product pour tous les exemples suivants.

Explication:

  • Pour savoir si l'une des conditions (présent dans aucun argument ou « | » dans tous les arguments. ») Est vrai, la compréhension de la liste est utilisée: Par exemple ['.' in l for l in c] est une liste des valeurs booléennes qui sont vraies si et seulement si l'argument correspondant contient un point. Puis any est utilisé pour vérifier si l'un des arguments contient un '.'.
  • La variable filt est définie en dehors de mapfun de sorte qu'il ne doit pas être recalculée à chaque appel à mapfun - A noter pollue l'espace de nom est ajouté en tant que propriété de l'objet de la fonction (voir What is the Python equivalent of static variables inside a function?)
  • Remarque partial(filter, f) qui est le même que lambda x: filter(f,x)
  • le lambda vérifie simplement à l'intérieur partielle si un élément est dans filt_set et doit donc être éliminé
  • *map(mapfun.filt,c) filtre simplement en utilisant tous les arguments mapfun.filt avant de les transmettre en tant que arguments de la fonction sélectionnée f
+0

peut-il être ajouté à 'def mapfun (c):' though. Je suis entrain de penser à ça, comment? – everestial007

+0

Oui - Si je comprends bien votre objectif, vous voudrez remplacer 'fun = it.product' par' fun = my_product' –

+0

Laissez-moi essayer cela très rapidement. – everestial007