2017-04-16 179 views
0

的比方說,我有這樣一個數據幀:熊貓 - 檢查字符串列包含一對字符串

df = pd.DataFrame({'consumption':['squirrel eats apple', 'monkey eats apple', 
            'monkey eats banana', 'badger eats banana'], 
        'food':['apple', 'apple', 'banana', 'banana'], 
        'creature':['squirrel', 'badger', 'monkey', 'elephant']}) 

    consumption creature food 
0 squirrel eats apple squirrel apple 
1 monkey eats apple badger apple 
2 monkey eats banana monkey banana 
3 badger eats banana elephant banana 

我想找到其中「生物」 &「食物」組合出現在列'消費'一欄,即如果蘋果和松鼠一起出現,則爲真,但如果蘋果與大象一起出現則爲假。同樣,如果猴子&香蕉一起出現,那麼True,但猴子蘋果會是假的。

我嘗試的方法是這樣的:

creature_list = list(df['creature']) 
creature_list = '|'.join(map(str, creature_list)) 

food_list = list(df['food']) 
food_list = '|'.join(map(str, food_list)) 

np.where((df['consumption'].str.contains('('+creature_list+')', case = False)) 
      & (df['consumption'].str.contains('('+food_list+')', case = False)), 1, 0) 

但是,這因爲我得到在所有情況下真不起作用。

如何檢查字符串對?

回答

4

這裏是一個可能的方式:

def match_consumption(r): 
    if (r['creature'] in r['consumption']) and (r['food'] in r['consumption']): 
     return True 
    else: 
     return False 

df['match'] = df.apply(match_consumption, axis=1) 
df 

      consumption creature food match 
0 squirrel eats apple squirrel apple True 
1 monkey eats apple badger apple False 
2 monkey eats banana monkey banana True 
3 badger eats banana elephant banana False 
+0

嘿@foglerit感謝,問題 - 如果的r [「消費」]'是另一個數據幀說'X [「消費」] '和我修改函數添加參數中的x,這仍然工作? – vagabond

+0

只是試着用兩個數據框,並得到這個錯誤:'TypeError:'系列'對象是可變的,因此他們不能被哈希',但你的答案是正確的基於我問的問題。在我的問題中,我沒有完全解決這個問題。 – vagabond

+0

@vagabond,如果'consumption'在另一個數據框中,則需要先合併這兩個DF,然後才能應用此方法。 – foglerit

0

我確定有更好的方法來做到這一點。但這是一種方式。

import pandas as pd 
import re 

df = pd.DataFrame({'consumption':['squirrel eats apple', 'monkey eats apple', 'monkey eats banana', 'badger eats banana'], 'food':['apple', 'apple', 'banana', 'banana'], 'creature':['squirrel', 'badger', 'monkey', 'elephant']}) 

test = [] 
for i in range(len(df.consumption)): 
    test.append(bool(re.search(df.creature[i],df.consumption[i])) & bool((re.search(df.food[i], df.consumption[i])))) 
df['test'] = test 
1

正在檢查字符串平等太簡單了?您可以測試如果字符串<creature> eats <food>consumption列等於相應的值:

(df.consumption == df.creature + " eats " + df.food)