Получить уникальные строки в столбце панд по разделителю - PullRequest
0 голосов
/ 19 декабря 2018

Допустим, у меня есть данные ниже:

import numpy as np
import pandas as pd

data=np.array([["xxx--xxx--xxx--yyy"],
              ["aaa--bbb--aaa--ccc"],
              ["xxx--axa--axa--ccc"],
              ["bbb--bab--bbb--bab--tgh"]])

df = pd.DataFrame({'Practice Column': data.ravel()})

print(df)

Как я могу создать новый столбец в этом кадре данных, который будет смотреть на строки и выплевывать уникальную комбинацию?Желаемый результат будет:

enter image description here

Любая помощь приветствуется.Спасибо.

Ответы [ 3 ]

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

Рассмотрите возможность использования OrderedDict здесь, чтобы отбросить дубликаты и сохранить порядок очень эффективно.

from collections import OrderedDict as o

df['Desired'] = [
    '--'.join(o.fromkeys(x.split('--'), 1)) 
    for x in df['Practice Column']]
df

           Practice Column        Desired
0       xxx--xxx--xxx--yyy       xxx--yyy
1       aaa--bbb--aaa--ccc  aaa--bbb--ccc
2       xxx--axa--axa--ccc  xxx--axa--ccc
3  bbb--bab--bbb--bab--tgh  bbb--bab--tgh

Производительность

df_ = df
df = pd.concat([df] * 1000, ignore_index=True)

%%timeit
df['des'] = [
     '--'.join(sorted(set(x.split('--')),key=x.index)) 
     for x in df['Practice Column']]

%%timeit
df['des'] = [
    '--'.join(o.fromkeys(x.split('--'), 1)) 
    for x in df['Practice Column']
]

14.6 ms ± 392 µs per loop (mean ± std. dev. of 7 runs, 100 loops each)
9.18 ms ± 265 µs per loop (mean ± std. dev. of 7 runs, 100 loops each)

Не рассчитано второе решение Джеза, поскольку оно не поддерживает порядок.

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

Надеюсь, что это работает

df = pd.DataFrame({'Practice Column': data.ravel(),'Desired':data.unique()})
0 голосов
/ 19 декабря 2018

Используйте понимание списка с split, pandas.unique для уникального с тем же порядком или set с sorted и последним join вместе:

df['des'] = ['--'.join(pd.unique(x.split('--'))) for x in df['Practice Column']]

Или:

df['des'] = ['--'.join(sorted(set(x.split('--')),key=x.index)) for x in df['Practice Column']]

print (df)
           Practice Column            des
0       xxx--xxx--xxx--yyy       xxx--yyy
1       aaa--bbb--aaa--ccc  aaa--bbb--ccc
2       xxx--axa--axa--ccc  xxx--axa--ccc
3  bbb--bab--bbb--bab--tgh  bbb--bab--tgh

Если порядок не важен, решение проще:

df['des'] = ['--'.join(set(x.split('--'))) for x in df['Practice Column']]
print (df)
           Practice Column            des
0       xxx--xxx--xxx--yyy       yyy--xxx
1       aaa--bbb--aaa--ccc  ccc--bbb--aaa
2       xxx--axa--axa--ccc  ccc--axa--xxx
3  bbb--bab--bbb--bab--tgh  bab--tgh--bbb
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...