我有一张这样的表:
col1 col2
ben US-US-Uk
Man Uk-NL-DE
bee CA-CO-MX-MX
如何将col 2中的值唯一,这意味着有一个这样的表?
col1 col2
ben US-Uk
Man Uk-NL-DE
bee CA-CO-MX
我试过这个:
a.cc.str.split('-').unique()
但收到以下错误:
TypeError: unhashable type: 'list'
有人知道怎么做吗?
答案 0 :(得分:2)
您可以使用apply
调用lambda函数来分割字符串,然后连接唯一值:
In [10]:
df['col2'] = df['col2'].apply(lambda x: '-'.join(set(x.split('-'))))
df
Out[10]:
col1 col2
0 ben Uk-US
1 Man Uk-NL-DE
2 bee CA-CO-MX
另一种方法:
In [22]:
df['col2'].str.split('-').apply(lambda x: '-'.join(set(x)))
Out[22]:
0 Uk-US
1 Uk-NL-DE
2 CA-CO-MX
Name: col2, dtype: object
<强>定时强>
In [24]:
%timeit df['col2'].str.split('-').apply(lambda x: '-'.join(set(x)))
%timeit df['col2'] = df['col2'].apply(lambda x: '-'.join(set(x.split('-'))))
1000 loops, best of 3: 418 µs per loop
1000 loops, best of 3: 246 µs per loop
答案 1 :(得分:2)
我喜欢@EdChum's answer。但重新排序这些价值观令人不安。它可以使人类视觉检查和机械比较更加困难。
不幸的是,Python没有有序集,这将是一个完美的工具。所以:
def unique(items):
"""
Return unique items in a list, in the same order they were
originally.
"""
seen = set()
result = []
for item in items:
if item not in seen:
result.append(item)
seen.add(item)
return result
df.col2 = df.col2.apply(lambda x: '-'.join(unique(x.split('-'))))
创建有序集的另一种方法是使用OrderedDict
:
from collections import OrderedDict
def u2(items):
od = OrderedDict.fromkeys(items)
return list(od.keys())
然后,您可以使用u2
代替unique
。无论哪种方式,结果都是:
col1 col2
0 ben US-Uk
1 Man Uk-NL-DE
2 bee CA-CO-MX
答案 2 :(得分:1)
试试这个
col2 = 'CA-CO-MX-MX'
print '-'.join(set(col2.split('-')))