我正在尝试将数据框过滤为具有列表中列值的行。但是,该列中的值将与列表不完全匹配。我可以做某种通配符或进一步包含吗?
例如,基于下面的列表和数据框,我想返回或过滤到第0行。
list = ["123 ABC", "456 DEF", "789 GHI"]
id idlist
0 ABC
1 XYZ
类似
df_2 = df[df["idlist"].isin(list)]
将不起作用,因为它将搜索完全匹配。
答案 0 :(得分:1)
这是一个比平常更复杂的字符串匹配问题,但是您可以使用列表理解来提高性能:
lst = ["123 ABC", "456 DEF", "789 GHI"]
df['match'] = [any(x in l for l in lst) for x in df['idlist']]
df
id idlist match
0 0 ABC True
1 1 XYZ False
要简单过滤,请使用
df[[any(x in l for l in lst) for x in df['idlist']]]
id idlist
0 0 ABC
列表推导是许多字符串操作的常用语法。我在For loops with pandas - When should I care?中写了一篇关于它们的优点的详细文章。
如果需要处理NaN,请使用带有try-catch处理功能。
def search(x, lst):
try:
return any(x in l for l in lst)
except TypeError:
return False
df[[search(x, lst) for x in df['idlist']]]
id idlist
0 0 ABC
答案 1 :(得分:0)
您可以使用运算符库检查字符串是否部分包含:
import operator
operator.contains('ABC','123 ABC')