2017-04-03 58 views
1

我有一個帶有NAME列和AGE列的熊貓df。 我給出了一系列名稱,並且我只想保留df中的行,其中NAME列具有系列中的名稱之一。此外,該系列在df中可能沒有全名,但只有其中的一部分(例如只是名字或姓氏)。保持包含給定列中來自給定列表的子串的熊貓df的行

例子:

df = NAME   AGE 
    John Stewart 26 
    Mary Doe  36 
    Luke Doe  29 
    Danny Smith  16 
    Jenny Brown  80 

series s (or list) = [Luke, Danny] 

我想

df2 = NAME   AGE 
     Luke Doe  29 
     Danny Smith  16 

我想的東西(很麻煩),如:

df["KEEP"] = None 
print (len(df.index)) 
for i in range(len(df.index)) : 
    for name in s: 
     row = df.iloc[i] 
     if name in row["NAME"]: 
      df["KEEP"][i] = True 
      break 
     df["KEEP"][i] = False 

return df[myData["KEEP"]==True] 

我知道這是尷尬的,並且,此外,它不起作用(額外的問題,超慢,但我不知道爲什麼)。 我該如何解決這個問題?

This回答案例,如果s只有一個元素,但我不能適應我的情況。

回答

1

你可以試試這個正則表達式的方法:

names = ['Luke', 'Danny'] 

df[df.NAME.str.contains("|".join(names))] 

#   NAME AGE 
#2  Luke Doe 29 
#3 Danny Smith 16 

這裏使用"|".join(names)創建一個模式:

"|".join(names) 
# 'Luke|Danny' 

然後使用str.contains檢測是否有任何名稱是一個字符串。

如果你需要忽略的情況下,使用flags參數與re.IGNORECASE

import re 
df[df.NAME.str.contains("|".join(names), flags=re.IGNORECASE)] 
相關問題