保持包含给定列中来自给定列表的子串的熊猫df的行
问题描述:
我有一个带有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只有一个元素,但我不能适应我的情况。
答
你可以试试这个正则表达式的方法:
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)]