迭代包含列表的pandas列中的值,并仅检索唯一值

时间:2014-01-21 18:49:32

标签: python regex pandas

这是我无法弄清楚的三个问题,希望有人可以帮助我。

import pandas as pd
data = {'Col1': ['ONE, ONE, NULL', 'ONE, TWO, THREE', 'TWO, NULL, TEN']}
index = pd.Index(['d1','d2','d3'])
data = pd.DataFrame(data,index=index)
pattern = 'ONE|TWO'                 <----QUESTION1
data['Col1'].str.findall(pattern)   <----QUESTION2

问题1:如何更改此正则表达式,以便只在d1中找到“ONE”一次?现在,每个ONE发现的实例将返回如下所示。

d1    [ONE, ONE]
d2    [ONE, TWO]
d3         [TWO]

我想要这个

d1         [ONE]
d2    [ONE, TWO]
d3         [TWO]

问题2:
我想将列表d1,d2和d3放入一个仅包含唯一值的列表中。这是这样的:

set(d1 + d2 + d3) ---> ['ONE', 'TWO']


问题3:
如果我会做这样的事情:

data['Col2'] = data['Col1'].str.findall(pattern)

我如何迭代Col2中的每一行以获得与我在Question2中所要求的相同的结果?

2 个答案:

答案 0 :(得分:3)

您可以使用reduce(over set.union):

In [11]: reduce(set.union, data['Col1'].str.findall(pattern), set())
Out[11]: {'ONE', 'TWO'}

另一种选择是使用列表理解:

In [12]: [w for w in ['ONE', 'TWO'] if data['Col1'].str.contains(w).any()]
Out[12]: ['ONE', 'TWO']

答案 1 :(得分:0)

对于问题1 ,请尝试:data['Col1'].str.findall(pattern).apply(set)

对于问题2,3 ,请尝试:{x for s in data['Col1'].str.findall(pattern).apply(set) for x in s}