保持pandas df行在给定列中包含来自给定列表的子字符串

时间:2017-04-03 22:01:12

标签: python pandas dataframe

我有一个带有NAME列和AGE列的pandas df。 我得到了一系列名称,我想只保留df中的行,其中NAME列具有系列中的一个名称。此外,该系列可能没有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]

我知道这很尴尬,而且,它不起作用(额外的问题,超慢,但我不知道为什么)。 我该如何解决这个问题?

如果s只有一个元素,那么

This就会回答这个问题,但我不能适应我的情况。

1 个答案:

答案 0 :(得分: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)]