Por ejemplo para las dos columnas

target        read
AATGGCATC     AATGGCATG
AATGATATA     AAGGATATA
AATGATGTA     CATGATGTA

Quiero agregar la columna

target        read       differnces
AATGGCATC     AATGGCATG  (C,G,8)
AATGATATA     AAGGATATA  (T,G,3)
AATGATGTA     CATGATGTA  (A,G,0)
1
Eilay Koren 23 jun. 2020 a las 13:09

2 respuestas

Creo que esta simple función podría ayudarlo (tenga en cuenta que esta no es una forma vectorizada de hacerlo):

import pandas as pd
import difflib as dl

# create a dataframe
# pass the columns as argument to the function below
# df refers to the data frame

def differences(a,b):
    differences=[]
    for i in range(len(a)):
        l=list(dl.ndiff(a[i].strip(),b[i].strip()))
        temp=[x[2] for x in l if x[0]!=' ' ]
        for x in l:
            if x[0]=='-' or x[0]=='+':
                temp.append(l.index(x))
        differences.append(tuple(temp[:3]))
    return differences

df['differences']=differences(df['target'],df['read'])
print(df)

Output

0
Sahaj Adlakha 23 jun. 2020 a las 10:57

Vamos a dividirnos en cada palabra (mientras eliminamos el espacio en blanco inicial) y crear un marco de datos apilado, allí podemos contar cada ocurrencia usando un recuento acumulativo y soltar todos los duplicados mientras finalmente creamos nuestra tupla.

Las funciones clave aquí serán explode, str_split, stack y drop_duplicates

s = (
    df.stack()
    .str.split("")
    .explode()
    .to_frame("words")
    .replace("", np.nan, regex=True)
    .dropna()
)

s['enum'] = s.groupby(level=[0,1]).cumcount()

df["diff"] = (
    s.drop_duplicates(subset=["words", "enum"], keep=False)
    .stack()
    .groupby(level=0)
    .agg(tuple) # change tuple for 'unique' if u want a list of unique items.
)

print(df)

      target       read          diff
0  AATGGCATC  AATGGCATG  (C, 8, G, 8)
1  AATGATATA  AAGGATATA        (G, 2)
2  AATGATGTA  CATGATGTA        (C, 0)

print(s.drop_duplicates(subset=["words", "enum"], keep=False))

         words  enum
0 target     C     8
  read       G     8
1 read       G     2
2 read       C     0
0
Datanovice 23 jun. 2020 a las 11:04