如何删除或筛选col4首值匹配DATA_SEL的col2值的DataFrame列表元素
解决方案
首先做前置效率优化:将DATA_SEL的col2列值转成集合,匹配查询的时间复杂度可以从O(n)降到O(1),数据量越大优势越明显。
import pandas as pd # 提取所有合法匹配值存入集合 valid_values = set(DATA_SEL['col2'])
注意不要用list作为变量名,这是Python的内置类型关键字,覆盖后会导致意料之外的错误,建议将存储DataFrame的列表重命名为df_list这类自定义名称。
需求1:从原列表删除不匹配的DataFrame
方法1:列表推导式覆盖原变量(写法最简单,绝大多数场景适用)
df_list = [df for df in df_list if df['col4'].iloc[0] in valid_values]
方法2:严格原地修改列表对象(适用于有其他引用共用该列表对象的场景)
倒序遍历删除可以避免正序删除时的索引偏移漏判问题:
for i in range(len(df_list)-1, -1, -1): first_col4_val = df_list[i]['col4'].iloc[0] if first_col4_val not in valid_values: del df_list[i]
需求2:构建新列表list2仅保留匹配的DataFrame
直接过滤生成新列表即可,不会修改原有列表:
list2 = [df for df in df_list if df['col4'].iloc[0] in valid_values]
如果需要兼容DataFrame为空、没有col4列的异常场景,可以用带异常捕获的写法:
list2 = [] for df in df_list: try: first_col4_val = df['col4'].iloc[0] if first_col4_val in valid_values: list2.append(df) except (KeyError, IndexError): # 无col4列或col4为空的DataFrame直接排除 continue
内容的提问来源于stack exchange,提问作者Jewel_R
相关产品推荐
相关产品推荐

