Как удалить дубликаты из списка столбцов в кадре данных в Python - PullRequest
0 голосов
/ 03 декабря 2018

У меня есть фрейм данных

id      rev     names
34e     A      su,ra,ve,ra,de,ra
45e     R      ra,su,su,ve,de
55e     G      su,ra,de
41e     M      su,de,mu,er,su

, теперь мне нужно удалить дубликат, и вывод должен быть таким, как показано ниже

id      rev     names
34e     A      su,ra,ve,de
45e     R      ra,su,ve,de
55e     G      su,ra,de
41e     M      su,de,mu,er

Ответы [ 3 ]

0 голосов
/ 03 декабря 2018

Предполагается, что имена имеют тип string:

import pandas as pd

data = [['34e', 'A', 'su,ra,ve,ra,de,ra'],
        ['45e', 'R', 'ra,su,su,ve,de'],
        ['55e', 'G', 'su,ra,de'],
        ['41e', 'M', 'su,de,mu,er,su']]

df = pd.DataFrame(data=data, columns=['id', 'rev', 'names'])

df['names'] = [','.join(set(name.split(','))) for name in df.names]
print(df)

Или если список типов:

import pandas as pd

data = [['34e', 'A', ['su', 'ra', 've', 'ra', 'de', 'ra']],
        ['45e', 'R', ['ra', 'su', 'su', 've', 'de']],
        ['55e', 'G', ['su', 'ra', 'de']],
        ['41e', 'M', ['su', 'de', 'mu', 'er', 'su']]]

df = pd.DataFrame(data=data, columns=['id', 'rev', 'names'])

df['names'] = [list(set(name)) for name in df.names]
print(df)

Выход

    id rev             names
0  34e   A  [su, ra, ve, de]
1  45e   R  [su, ra, ve, de]
2  55e   G      [su, ra, de]
3  41e   M  [su, er, mu, de]
0 голосов
/ 03 декабря 2018

Используя split, следуйте с sorted + set, затем join вернитесь к строке

df.names.str.split(',').map(lambda x : ','.join(sorted(set(x),key=x.index)))
Out[763]: 
0    su,ra,ve,de
1    ra,su,ve,de
2       su,ra,de
3    su,de,mu,er
Name: names, dtype: object
0 голосов
/ 03 декабря 2018

Если в столбце сначала содержатся строки split, преобразуйте в set s и join:

df['names'] = df['names'].apply(lambda x: ','.join(set(x.split(','))))

Если в столбце содержатся списки, необходимо преобразовать в set и list:

df['names'] = df['names'].apply(lambda x: list(set(x)))

Если важен порядок, используйте pandas.unique:

df['names'] = df['names'].apply(lambda x: ','.join(pd.unique(x.split(','))))

df['names'] = df['names'].apply(lambda x: list(pd.unique(x)))
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...