这是我无法弄清楚的三个问题,希望有人可以帮助我。
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中所要求的相同的结果?
答案 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}