上一篇
DataFrame筛选数据与loc的用法
- 行业动态
- 2025-04-10
- 6
DataFrame中筛选数据常用loc方法,通过行/列标签或布尔索引选取特定数据,loc支持标签切片、条件筛选及行列组合操作,语法为df.loc[行选择, 列选择],适用于精确数据定位,能高效提取符合条件的数据子集,是数据处理中的核心筛选工具。
在数据分析中,Pandas的DataFrame是处理结构化数据的核心工具,无论是数据清洗、特征提取还是业务分析,筛选数据都是高频操作,本文将深入讲解如何通过loc
方法实现精准筛选,并提供可直接复用的代码示例与避坑指南。
DataFrame筛选数据的核心逻辑
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进行逐行调试。
(正文结束)