use*_*545 6 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
Run Code Online (Sandbox Code Playgroud)
问题1:如何更改此正则表达式,以便在"d1"中仅找到"ONE"一次?因为它现在将返回ONE的每个实例,如下所示.
d1 [ONE, ONE]
d2 [ONE, TWO]
d3 [TWO]
Run Code Online (Sandbox Code Playgroud)
我要这个
d1 [ONE]
d2 [ONE, TWO]
d3 [TWO]
Run Code Online (Sandbox Code Playgroud)
问题2:
我想将列表d1,d2和d3放入一个仅包含唯一值的列表中.这是这样的:
set(d1 + d2 + d3) ---> ['ONE', 'TWO']
Run Code Online (Sandbox Code Playgroud)
问题3:
如果我会做这样的事情:
data['Col2'] = data['Col1'].str.findall(pattern)
Run Code Online (Sandbox Code Playgroud)
我如何迭代Col2中的每一行以获得与我在Question2中所要求的相同的结果?
您可以使用reduce(通过set.union):
In [11]: reduce(set.union, data['Col1'].str.findall(pattern), set())
Out[11]: {'ONE', 'TWO'}
Run Code Online (Sandbox Code Playgroud)
另一种选择是使用列表理解:
In [12]: [w for w in ['ONE', 'TWO'] if data['Col1'].str.contains(w).any()]
Out[12]: ['ONE', 'TWO']
Run Code Online (Sandbox Code Playgroud)