У меня есть датафрейм с информацией, как показано ниже, хранится в одном столбце

>>> Results.Category[:5]
0    issue delivery wrong master account
1      data wrong master account batch
2    order delivery wrong data account
3    issue delivery wrong master account
4    delivery wrong master account batch
Name: Category, dtype: object

Теперь я хочу сохранить уникальное слово в столбце «Категория». Например: в первой строке присутствует слово «неправильно». Я хочу удалить его из всех остальных строк и оставить слово «неправильно» только в первой строке. Во второй строке слово «данные» тогда я хочу удалить его из всех остальных строк и сохранить слово «данные» только во второй строке

Я обнаружил, что если дубликаты доступны в строке, мы можем удалить их, используя ниже, но мне нужно удалить дубликаты слов из столбцов, Может кто-нибудь, пожалуйста, помогите мне здесь.

AFResults['FinalCategoryN'] = AFResults['FinalCategory'].apply(lambda x: remove_dup(x))
1
user3734568 2 Июл 2019 в 16:46

4 ответа

Лучший ответ

Кажется, вы хотите что-то вроде,

out = []
seen = set()
for c in df['Category']:
    words = c.split()
    out.append(' '.join([w for w in words if w not in seen]))
    seen.update(words)

df['FinalCategoryN'] = out
df

                              Category                       FinalCategoryN
0  issue delivery wrong master account  issue delivery wrong master account
1      data wrong master account batch                           data batch
2    order delivery wrong data account                                order
3  issue delivery wrong master account                                     
4  delivery wrong master account batch                                     

Если вас не волнует порядок, вы можете использовать заданную логику:

u = df['Category'].apply(str.split)
v = split.shift().map(lambda x: [] if x != x else x).cumsum().map(set)
(u.map(set) - v).str.join(' ')

0    account delivery issue master wrong
1                             batch data
2                                  order
3                                       
4                                       
Name: Category, dtype: object
3
cs95 2 Июл 2019 в 14:12

То, что вы не можете векторизовать, так что давайте просто забудем о пандах и используем Python set:

total = set()
result = []
for line in AFResults['FinalCategory']:
    line = set(line.split()).difference(total)
    total = total.union(line)
    result.append(' '.join(line))

Вы получите этот список: ['wrong issue master delivery account', 'batch data', 'order', '', '']

Вы можете использовать его для заполнения столбца данных:

AFResults['FinalCategoryN'] = result
1
Serge Ballesta 2 Июл 2019 в 14:52

В вашем случае вам сначала нужно split, а затем удалить дубликат с помощью drop_duplicates

df.c.str.split(expand=True).stack().drop_duplicates().\
     groupby(level=0).apply(','.join).reindex(df.index)
Out[206]: 
0    issue,delivery,wrong,master,account
1                             data,batch
2                                  order
3                                    NaN
4                                    NaN
dtype: object
2
YO and BEN_W 2 Июл 2019 в 13:57

Используйте apply с sorted и set и str.join и list.index:

AFResults['FinalCategoryN'] = AFResults['FinalCategory'].apply(lambda x: ' '.join(sorted(set(x.split()), key=x.index)))
0
U10-Forward 2 Июл 2019 в 13:51