如何使用filter关键字与lambda函数筛选pandas DataFrame指定列?
如何用filter关键字结合lambda函数筛选pandas DataFrame的指定列
你需要明确:pandas的DataFrame.filter()方法是用来按名称筛选行/列的(比如匹配列名、索引名),不能直接传入lambda按行内容过滤。如果你想用Python内置的filter函数配合lambda实现行筛选,得结合DataFrame的行迭代器,同时更推荐用pandas原生的布尔索引(性能更高)。
方法1:Python内置filter + df.iterrows()
内置filter可以对可迭代对象做过滤,df.iterrows()会返回每行的(索引, 行Series)元组,所以lambda需要处理这个元组:
import pandas as pd data = [{ 'Language': 'Python', 'Percent grow': 56 }, { 'Language': 'Java', 'Percent grow': 34 }, { 'Language': 'C', 'Percent grow': 25 }, { 'Language': 'C++', 'Percent grow': 12 }, { 'Language': 'go', 'Percent grow': 5 }] df = pd.DataFrame(data) # 用内置filter筛选符合条件的行 filtered_rows = filter(lambda x: x[1]['Percent grow'] > 30, df.iterrows()) # 将筛选结果转为DataFrame filtered_df = pd.DataFrame([row[1] for row in filtered_rows]) print(filtered_df)
输出结果:
Language Percent grow 0 Python 56 1 Java 34
方法2:更高效的pandas原生布尔索引
虽然你问的是filter+lambda,但处理DataFrame时,布尔索引是最优方案——它是向量化操作,比迭代行快得多,代码也更简洁:
filtered_df = df[df['Percent grow'] > 30] print(filtered_df)
输出结果和上面完全一致,数据量越大,这个方法的优势越明显。
为什么你的原代码会报错?
你写的df.filter(f)调用的是pandas的DataFrame.filter()方法,它的参数只能是items(指定列/行名称)、like(模糊匹配名称)、regex(正则匹配名称),不支持传入lambda按行内容过滤,因此会触发错误。
内容的提问来源于stack exchange,提问作者rushikesh
相关产品推荐
相关产品推荐

