Python Pandas:如何在列中使用唯一字符串

时间:2015-03-24 14:02:42

标签: python pandas ipython dataframe

我有一张这样的表:

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'

有人知道怎么做吗?

3 个答案:

答案 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('-')))