2014-01-21 117 views
6

這是三個問題,我只是無法弄清楚,希望有人能幫助我。迭代包含列表的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一旦發現?因爲它現在是每個發現的實例將被返回,如下所示。

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中要求的結果是一樣的嗎?

回答

3

可以使用減少(超過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'] 
+0

完美解決Question2,謝謝!我將如何繼續並從熊貓表中提取一個列表?我想爲Col2中的每一行創建一個新列表,創建的列表應該具有Col2中所示的形狀。 – user3139545

+0

@ user3139545我不知道你在問什麼:s FWIW大熊貓的經驗法則是避免在DataFrame/Series中列表,通常有更好的方法。 –

+0

在Col2中,我將有一個看起來像這樣['ONE','TWO','THREE']的字符串,現在我想爲每一行讀取這個字符串,並將它寫入一個python列表中。 – user3139545

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}

+0

這將左值的set()文本存儲起來。所以對於D1,Col2會說設置([ONE]),我可以不這樣做,只是因此得到[ONE]? – user3139545

+0

對於問題3我不想使用Col1,我想創建列表,因爲它們顯示在Col2中。 – user3139545

相關問題