我有一个 pandas df,其中包含 NAME 列和 AGE 列。 我得到了一系列名称,我只想保留 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]
我知道这很尴尬,而且,它不起作用(额外的问题,超慢,但我不知道为什么)。 我该如何解决这个问题?
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)]
关于python - 保留 pandas df 的行在给定列中包含给定列表中的子字符串,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/43195049/