如何用列表值过滤Pandas DataFrame?求非循环实现方法
解决Pandas筛选列表列中包含指定值的问题
问题原因
你直接使用1 in df['B'](注:你代码里写的df['custom_test_type']应为笔误,实际目标列是df['B'])的逻辑存在错误:这个表达式是判断1是否存在于整个Series的索引或元素集合中,而非逐行检查每个列表元素是否包含1,因此会始终返回True,无法实现逐行筛选。
无循环的实现方法
以下是几种无需手动编写循环的高效筛选方式:
方法1:使用apply结合lambda
这是最直观的实现方式,Pandas内部会对apply操作做优化,避免手动循环的低效问题:
import pandas as pd df = pd.DataFrame({'A' : [1,2,3,4], 'B' : [[1, 2, 3], [2, 3], [3], [1, 2, 3]]}) # 筛选B列包含1的行 filtered_df = df[df['B'].apply(lambda x: 1 in x)] print(filtered_df)
方法2:使用map方法
逻辑与apply一致,语法更简洁:
filtered_df = df[df['B'].map(lambda x: 1 in x)]
方法3:使用numpy.vectorize实现矢量化判断
如果偏好矢量化风格的语法,可以用np.vectorize包装判断逻辑:
import pandas as pd import numpy as np df = pd.DataFrame({'A' : [1,2,3,4], 'B' : [[1, 2, 3], [2, 3], [3], [1, 2, 3]]}) contains_one = np.vectorize(lambda x: 1 in x) filtered_df = df[contains_one(df['B'])]
输出结果
以上方法都会得到你预期的输出:
A B 0 1 [1, 2, 3] 3 4 [1, 2, 3]
内容的提问来源于stack exchange,提问作者Max Tsai
相关产品推荐
相关产品推荐

