通过定界符在pandas列中获取唯一字符串

时间:2018-12-19 06:31:19

标签: python pandas

假设我有以下数据:

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 :(得分:5)

将列表理解与splitpandas.unique一起使用以相同的顺序进行唯一化,或者将setsorted和最后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

答案 1 :(得分:2)

考虑在此处使用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)

Jez的第二个解决方案没有计时,因为它不维持秩序。

答案 2 :(得分:1)

希望这行得通

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