Soy un principiante en pandas (me disculpo si estoy usando la terminología incorrecta) y actualmente estoy trabajando en un proyecto de genómica. Tengo problemas para manipular columnas de marcos de datos después de usar drop_duplicates (). Quiero cambiar los valores de la columna en la columna 'mutación' de la identificación que se mantiene después de eliminar los duplicados para indicar que esta identificación tiene múltiples mutaciones.

Mi código:

df = pd.DataFrame([
('MYC', 'nonsense', 's1'),
('MYC', 'missense', 's1'),
('MYCL', 'nonsense', 's1'),
('MYCL', 'missense', 's2'),
('MYCN', 'missense', 's3'),
('MYCN', 'UTR', 's1'),
('MYCN', 'nonsense', 's1')
], columns=['id', 'mutation', 'sample'])

print(df)

Resultado:

     id  mutation sample
0   MYC  nonsense     s1
1   MYC  nonsense     s1
2   MYC  missense     s1
3  MYCL  nonsense     s1
4  MYCL  missense     s2
5  MYCN  missense     s3
6  MYCN       UTR     s1
7  MYCN  nonsense     s1

Intenté usar drop_duplicates () y me estoy acercando a lo que quiero. Pero, ¿cómo cambio el valor en la columna 'mutación' a 'multi'?

 print(df.drop_duplicates(subset=('sample','id')))
     id  mutation sample
0   MYC  nonsense     s1
3  MYCL  nonsense     s1
4  MYCL  missense     s2
5  MYCN  missense     s3
6  MYCN       UTR     s1

Lo que quiero:

     id  mutation sample
0   MYC  multi        s1
3  MYCL  nonsense     s1
4  MYCL  missense     s2
5  MYCN  missense     s3
6  MYCN  multi        s1
1
Dr. Brynjolf 16 oct. 2018 a las 18:15

2 respuestas

La mejor respuesta

duplicated

mask = df.duplicated(['id', 'sample'], keep=False)
df.assign(mutation=df.mutation.mask(mask, 'multi')).drop_duplicates()

     id  mutation sample
0   MYC     multi     s1
2  MYCL   nonsens     s1
3  MYCL  missense     s2
4  MYCN  missense     s3
5  MYCN     multi     s1

groupby

df.groupby(['id', 'sample'], sort=False).mutation.pipe(
    lambda g: g.first().mask(g.size() > 1, 'multi')
).reset_index().reindex(df.columns, axis=1)

     id  mutation sample
0   MYC     multi     s1
1  MYCL   nonsens     s1
2  MYCL  missense     s2
3  MYCN  missense     s3
4  MYCN     multi     s1
2
piRSquared 16 oct. 2018 a las 15:34
df.loc[df.duplicated(subset=['id', 'sample'], keep='last'), 'mutation'] = 'multi'
df.drop_duplicates(subset=['id', 'sample'])

Explicación: primero identifique cuáles son los duplicados y cambie la columna de mutación por esos. Solo después, suelte los duplicados.

1
Jondiedoop 16 oct. 2018 a las 15:24