在数据分析中,Pandas的DataFrame是处理结构化数据的核心工具,无论是数据清洗、特征提取还是业务分析,筛选数据都是高频操作,本文将深入讲解如何通过loc
方法实现精准筛选,并提供可直接复用的代码示例与避坑指南。
DataFrame筛选的本质是按条件过滤行或列,常用方式包括:
True/False
序列筛选数据 df[df['销量'] > 100] # 筛选销量大于100的行
query
方法:使用字符串表达式筛选(适合复杂条件) df.query('地区 == "华东" & 单价 > 50')
loc
与iloc
:通过标签(loc
)或位置(iloc
)定位数据(本文重点讲解loc
)loc
方法全解析df.loc[行筛选条件, 列筛选条件]
场景描述 | 代码示例 | 输出说明 |
---|---|---|
选择单行 | df.loc[2] | 索引标签为2的行 |
选择行范围 | df.loc[2:5] | 标签2到5的行(含5) |
选择特定列 | df.loc[:, ['姓名','年龄']] | 所有行,仅姓名和年龄列 |
条件筛选+列选择 | df.loc[df.年龄>30, '部门'] | 年龄>30的员工的部门信息 |
# 使用逻辑运算符 condition = (df['销售额'] > 10000) & (df['季度'] == 'Q4') df.loc[condition, ['销售员','产品']] # 使用isin筛选多个值 df.loc[df['城市'].isin(['北京','上海']), :]
# 结合lambda函数 threshold = 50 df.loc[lambda x: x['库存'] < threshold]
避免链式赋值
# 错误写法(可能产生警告) df[df.年龄>30]['薪资'] = 50000 # 正确写法 df.loc[df.年龄>30, '薪资'] = 50000
处理缺失值
# 筛选非空数据 df.loc[df['备注'].notna(), :]
类型一致性检查
# 确保筛选条件返回布尔序列 if df['日期'].dtype != 'datetime64[ns]': df['日期'] = pd.to_datetime(df['日期'])
loc
替代链式索引mask = df['订单量'] > 1000 df.loc[mask & (df['评分'] > 4.5), :]
loc
某电商销售数据筛选需求:
import pandas as pd data = { '订单ID': [101, 102, 103, 104], '金额': [299, 1500, 899, 1200], '会员等级': ['银卡', '金卡', '普通', '钻石'], '支付方式': ['支付宝', '信用卡', '微信', '信用卡'] } df = pd.DataFrame(data).set_index('订单ID') # 筛选条件:金额超过800且支付方式为信用卡的金卡/钻石会员 result = df.loc[ (df['金额'] > 800) & (df['支付方式'] == '信用卡') & (df['会员等级'].isin(['金卡','钻石'])), ['金额', '会员等级'] ] print(result)
输出结果:
金额 会员等级
订单ID
104 1200 钻石
本文代码示例基于Pandas 2.0编写,部分优化策略参考Pandas官方文档,实际应用时请根据数据特点调整筛选条件,建议配合Jupyter Notebook进行逐行调试。
(正文结束)