Python - как удалить дубликат списка в каждой строке (панды)? - PullRequest
0 голосов
/ 23 октября 2018

У меня есть список, содержащийся в каждой строке, и я хотел бы удалить дублированный элемент, сохранив наибольшее значение из оценки.

вот мои данные из фрейма данных df1

        pair    score
0   [A , A ]    1.0000
1   [A , F ]    0.9990
2   [A , G ]    0.9985
3   [A , G ]    0.9975
4   [A , H ]    0.9985
5   [A , H ]    0.9990

Я хотел бы видеть результат как

            pair    score
    0   [A , A ]    1.0000
    1   [A , F ]    0.9990
    2   [A , G ]    0.9985
    4   [A , H ]    0.9990

Я попытался использовать group by и установитьсчет = макс, но он не работает

Ответы [ 2 ]

0 голосов
/ 23 октября 2018

Создать новый столбец pair2 с отсортированными значениями типа строки, а затем отбросить дубликаты. Будет обрабатывать, если пара имеет значения [A,G] и [G,A], обрабатывая их одинаково

df['pair2']=df.pair.map(sorted).astype(str)
df.sort_values('score',ascending=False).drop_duplicates('pair2',keep='first').drop('pair2',axis=1).reset_index(drop=True)

Ouput:

pair    score
[A, A]  1.0000
[A, F]  0.9990
[A, H]  0.9990
[A, G]  0.9985
0 голосов
/ 23 октября 2018

Сначала я думаю, что работать с list s в пандах - это не хорошая идея .

Решение работает, если преобразовать списки в вспомогательный столбец с кортежами - тогда sort_values с drop_duplicates:

df['new'] = df.pair.apply(tuple)
df = df.sort_values('score', ascending=False).drop_duplicates('new')
print (df)
     pair   score     new
0  [A, A]  1.0000  (A, A)
1  [A, F]  0.9990  (A, F)
5  [A, H]  0.9990  (A, H)
2  [A, G]  0.9985  (A, G)

или с двумя новыми столбцами:

df[['a', 'b']] = pd.DataFrame(df.pair.values.tolist())
df = df.sort_values('score', ascending=False).drop_duplicates(['a', 'b'])
print (df)
     pair   score  a  b
0  [A, A]  1.0000  A  A
1  [A, F]  0.9990  A  F
5  [A, H]  0.9990  A  H
2  [A, G]  0.9985  A  G
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...