Замена определенных значений столбца после удаления дубликатов в кадре данных Pandas

1

Я новичок в пандах (я прошу прощения, если я использую неправильную терминологию), и сейчас я работаю над проектом геномики. У меня возникли проблемы с манипулированием столбцами dataframes после использования drop_duplicates(). Я хочу изменить значения столбца в "мутации" столбца идентификатора, который сохраняется после удаления дубликатов, чтобы указать, что этот идентификатор имеет несколько мутаций.

Мой код:

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)

Результат:

     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

Я попытался использовать drop_duplicates(), и я приближаюсь к тому, что хочу. Но как изменить значение в столбце "мутация" на "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

Что я хочу:

     id  mutation sample
0   MYC  multi        s1
3  MYCL  nonsense     s1
4  MYCL  missense     s2
5  MYCN  missense     s3
6  MYCN  multi        s1
Теги:
pandas

2 ответа

1
Лучший ответ

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
  • 0
    Это прекрасно работает! Спасибо за предоставление разных способов решения проблемы :)
1
df.loc[df.duplicated(subset=['id', 'sample'], keep='last'), 'mutation'] = 'multi'
df.drop_duplicates(subset=['id', 'sample'])

Объяснение: сначала определите, какие дубликаты, и измените для них столбец мутации. Только после этого сбросьте дубликаты.

Ещё вопросы

Сообщество Overcoder
Наверх
Меню