2016-05-20 44 views
0

我有類似如下結構的數據幀:熊貓:搜索和返回數據幀,包括在一列特殊的話

NDB_No Shrt_Desc Water_(g) Energ_Kcal Protein_(g) ... 
01001 BUTTER,WITH SALT 15,87 717 0,85 
01002 BUTTER,WHIPPED,W/ SALT 16,72 718 0,49 
... 
01004 CHEESE,BLUE 42,41 353 21,4 28,74 
01005 CHEESE,BRICK 41,11 371 23,24 29,68 

我希望得到一個數據幀只包括其中的Shrt_Desc行列中包含列表中的項目to_be_found = [BUTTER, PASTA, ..etc]但不是CHEESE
要找到的單詞(在上面的列表中)可以是Shrt_Desc中的任意位置,不一定在開頭,例如上面的SALT

我該如何解決這個問題?
謝謝!

+0

爲了使它更容易幫助,您能提供一個最小,完整和可驗證的例子嗎? http://stackoverflow.com/help/mcve。無論如何,您可能會得到某人回答您的問題,但如果您遵循鏈接文章中的標準,則可能會更快。它允許我將您的示例複製並粘貼到我的環境中並進行實驗。這節省了我的時間,並使答案更相關。 – piRSquared

回答

0

下面的代碼可以解決此問題(根據@piRSquared提示以上)。

import pandas as pd 
from collections import Counter 

food_info = pd.read_excel("ABBREV.xlsx") 
dfi_1 = food_info 


to_be_found = ['BUTTER', 'CHEESE', 'MILK', 'OIL', 'CORN', 'SALT', 'INF', 'PEPPER', 'PASTA', 'GLUTEN-FREE'] 
found = [] 
dfi_6 = dfi_1.Shrt_Desc.str.split(',') 
for row in dfi_6.iteritems(): 
    for x in to_be_found: 
     if x in row[1]: 
      found.append(x) 

print(found) 
print(len(found)) 

c = Counter(found) 
print(c) 
1

我會split'Shrt_Desc'列通過逗號,然後看看'CHEESE'是否在每個分割列表中。使用此面具的DataFrame

to_be_found = set(('SALT', 'BUTTER')) 

mask = df.Shrt_Desc.str.split(',').apply(lambda x: to_be_found in x) 

df[mask] 

的樣子:

NDB_No     Shrt_Desc 
0 01001   BUTTER,WITH SALT 
1 01002 BUTTER,WHIPPED,WITH SALT 
+0

謝謝,這不會使它成爲現實,因爲正如上面的示例中的'WITH SALT'情況和其他類似的描述,如:'CRACKERS,GLUTEN-FREE,MULTI-SEEDED&MULTIGRAIN'存在。那就是爲什麼我會使用['BUTTER','PAST,'GLUTEN']的列表你的lambda函數可以迭代上一個列表? – Paradigm

+0

增加了對'to_be_found'的引用,該引用應該解決問題 – piRSquared

+0

完整的數據集位於[link](http://www.ars.usda.gov/Services/docs.htm?docid=25700)(EXCEL文件)如果你想實驗。 – Paradigm