假设我有以下数据:
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)
如何在此数据框中创建一个新列,以查看字符串并吐出唯一的组合?所需的输出将是:
感谢您的帮助。谢谢。
答案 0 :(得分:5)
将列表理解与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
答案 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()})