如何用.loc或函数按列名字符串与列内值过滤Pandas DataFrame?
解决方案:可复用的DataFrame筛选方法
单个.loc直接实现
先构造示例DataFrame:
import pandas as pd df = pd.DataFrame({ 'Country/Region': ['France', 'France', 'United Kingdom', 'United Kingdom', 'France'], 'Record ID': [118, 110, 146, 836, 944] })
通过两步完成筛选:
- 定位列名包含指定字符串的目标列
- 用
.loc筛选该列值符合要求的行,同时保留所有列
# 找到列名含'Country'的目标列 target_col = df.columns[df.columns.str.contains('Country')].item() # 筛选行并输出结果 filtered_df = df.loc[df[target_col] == 'France', :] print(filtered_df)
输出结果:
Country/Region Record ID 0 France 118 1 France 110 4 France 944
封装为可复用函数(适配多组条件)
如果需要频繁使用这类筛选逻辑,或者要支持多组条件组合,直接封装成函数更高效:
基础版(单条件)
def filter_df_by_col_pattern(df, col_pattern, target_value): # 获取匹配列名模式的列 matching_cols = df.columns[df.columns.str.contains(col_pattern)] if not matching_cols.empty: target_col = matching_cols.item() # 返回筛选后的DataFrame return df.loc[df[target_col] == target_value, :] # 无匹配列时返回空DataFrame return pd.DataFrame()
调用示例:
result = filter_df_by_col_pattern(df, 'Country', 'France')
进阶版(多条件组合)
如果需要同时满足多组「列名匹配+值匹配」的条件,可以扩展函数支持批量条件:
def filter_df_by_multi_conditions(df, conditions): # 初始化全True的布尔掩码 mask = pd.Series([True]*len(df), index=df.index) for col_pattern, target_value in conditions: matching_cols = df.columns[df.columns.str.contains(col_pattern)] if matching_cols.empty: continue target_col = matching_cols.item() # 叠加条件(逻辑与) mask &= df[target_col] == target_value return df.loc[mask, :]
调用示例(比如同时筛选Country为France、Record ID包含11的行):
conditions = [('Country', 'France'), ('Record', '11')] result = filter_df_by_multi_conditions(df, conditions)
关于lambda+filter的问题
filter函数更适合处理一维序列,而DataFrame的筛选依赖布尔索引,直接用.loc结合str.contains定位列、生成行筛选掩码是更贴合pandas的写法,没必要强行用lambda+filter。
内容的提问来源于stack exchange,提问作者Newbielp
相关产品推荐
相关产品推荐

