我有一个DataFrame
与100万行和10列。每一列都是一个元素列表(可以是空列表,也可以是包含最多5个元素的列表)。假设我有另一个包含100000个元素的列表,我想只过滤DataFrame
中给定列(例如columnA
)包含100000个元素大列表中的任何元素的行。这是我当前的代码:
df = df[df["columnA"].apply(lambda x: any(value in valuesList for value in x))]
,但它需要大量的时间来计算它。我怎么能加快代码?
你的算法复杂度是O(n^3)。第一个n表示遍历所有行。第二个n表示遍历单元格中的所有值。第三个n用于遍历与单元格值进行比较的列表项(通过检查列表是否包含特定值来完成)。正如@Marat建议的那样:使用一套。检查一个集合是否包含一个特定的值是常数时间O(1)。这将复杂度降低到O(n^2)。
s = set(valuesList)
df = df[df["columnA"].apply(lambda x: any(value in s for value in x))]