我正在尝试将数据帧过滤为列表中具有列值的行。但是,列中的值不会与列表完全匹配。我可以使用某种通配符或进一步包含吗?
例如,根据下面的列表和数据框,我想返回或过滤到第 0 行。
list = ["123 ABC", "456 DEF", "789 GHI"]
id idlist
0 ABC
1 XYZ
类似
df_2 = df[df["idlist"].isin(list)]
不起作用,因为它将搜索完全匹配的内容。
最佳答案
这是一个比平常更复杂的字符串匹配问题,但您可以使用列表理解来提高性能:
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
关于python - 如果列位于列表的任何部分,则过滤数据框,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/56245450/