如何在Pandas中使用.loc对多列进行大小写不敏感筛选
Pandas大小写不敏感数据筛选实现
需要实现Pandas中大小写不敏感的数据筛选,比如输入'fred'时能匹配到包含'Fred'的记录。现有如下find函数,但无法通过.lower()同时转换输入字符串和待筛选值的大小写:
def find(**kwargs): result = data.loc[data.rename(columns={"FirstName": "first", "LastName": "last", "City": "city", })[list(kwargs.keys())] .eq(list(kwargs.values())).all(axis=1)] return result
示例数据
| FirstName | LastName | City |
|---|---|---|
| Fred | Bob | Austin |
| Billy | Bob | NYC |
期望结果
调用find(first='fred')时,返回包含Fred的记录:
FirstName LastName City 0 Fred Bob Austin
解决方案
要实现大小写不敏感匹配,核心是同时将待筛选的列值和输入的筛选参数统一转为小写(或大写),再进行相等判断。修改后的find函数如下:
def find(**kwargs): # 定义列名映射(原列名 -> 简化名) col_mapping = {"FirstName": "first", "LastName": "last", "City": "city"} # 反转映射,方便从简化名找到原列名 reverse_mapping = {v: k for k, v in col_mapping.items()} # 提取需要筛选的原列名,以及转为小写的筛选值 target_cols = [reverse_mapping[key] for key in kwargs.keys()] lower_values = [val.lower() for val in kwargs.values()] # 将目标列转为小写后,与筛选值匹配,所有条件满足则保留该行 match_mask = data[target_cols].apply(lambda col: col.str.lower()).eq(lower_values).all(axis=1) return data.loc[match_mask]
使用示例
import pandas as pd # 构造示例数据集 data = pd.DataFrame({ "FirstName": ["Fred", "Billy"], "LastName": ["Bob", "Bob"], "City": ["Austin", "NYC"] }) # 调用筛选函数,传入小写参数 result = find(first='fred') print(result)
输出结果:
FirstName LastName City 0 Fred Bob Austin
内容的提问来源于stack exchange,提问作者Emm
相关产品推荐
相关产品推荐

