惯性聚合 高效追踪和阅读你感兴趣的博客、新闻、科技资讯
阅读原文 在惯性聚合中打开

推荐订阅源

Recent Announcements
Recent Announcements
H
Hackread – Cybersecurity News, Data Breaches, AI and More
Cyber Security Advisories - MS-ISAC
Cyber Security Advisories - MS-ISAC
B
Blog
T
The Blog of Author Tim Ferriss
J
Java Code Geeks
腾讯CDC
D
Docker
G
Google Developers Blog
D
DataBreaches.Net
雷峰网
雷峰网
Blog — PlanetScale
Blog — PlanetScale
S
SegmentFault 最新的问题
The Cloudflare Blog
有赞技术团队
有赞技术团队
OSCHINA 社区最新新闻
OSCHINA 社区最新新闻
Stack Overflow Blog
Stack Overflow Blog
大猫的无限游戏
大猫的无限游戏
量子位
美团技术团队
aimingoo的专栏
aimingoo的专栏
奇客Solidot–传递最新科技情报
奇客Solidot–传递最新科技情报
Engineering at Meta
Engineering at Meta
freeCodeCamp Programming Tutorials: Python, JavaScript, Git & More

博客园 - 梦徒

服务器RAID卡和HBA区分 Linux中服务进程相关操作 K8s 通过标签选择器查询日志 dify的定义 查看服务器SN序列号和型号 Nacos功能与作用 K8s节点NotReady恢复方法 GPU和CPU的知识 K8s 集群巡检项整理 K8s运维的核心能力建设 Ceph 分布式存储系统 VMware备份接口 股市布林线(BOLL)指标三条线的使用技巧 Python 数据分析入门|02:Pandas 数据清洗:缺失值/重复值/异常值处理 Python 数据分析入门|01 Pandas 基础:1 行代码读取 Excel/Csv文件 python f-string格式化输出 Python数据分析利器-Pandas 简介 python-分割文件名及后缀 python类及三大特性 Python 类的属性和方法详解 Python 必背内置函数 python常用数据结构之字典 MQ三巨头RocketMQ、Kafka、RabbitMQ 选型 一文搞懂 Redis 的三种集群方案 VMware ESXi 磁盘置备类型详解 Linux 实例:配置 NTP 服务 Kubernetes 运维必备之常用命令总结 Kubernetes + CI/CD 全流程指南!实现自动化部署 Linux Redhat 7.9 下 Docker 离线安装部署
Python数据分析利器-Pandas数据处理-筛选与排序
梦徒 · 2026-01-14 · via 博客园 - 梦徒

条件筛选(布尔索引)  

布尔索引是Pandas中最强大的数据筛选方式,它允许我们使用逻辑条件快速过滤数据。

基本布尔筛选

import pandas as pd
import numpy as np

data = {
    '姓名': ['张三','李四','王五','赵六','田七'],
    '年龄': [25,32,28,45,31],
    '工资': [8000, 12000, 9500, 20000, 11000],
    '部门': ['市场部', '技术部', '市场部', '管理部', '技术部']
}

df = pd.DataFrame(data=data)
# 筛选年龄大于30的员工
#older_than_30 = df['年龄'] > 30
older_than_30 = df[df['年龄'] > 30]
print(older_than_30)
# 筛选技术部的员工
tech_dept = df[df['部门'] == '技术部']
print("\n技术部员工:\n", tech_dept)

##############################################
   姓名  年龄     工资   部门
1  李四  32  12000  技术部
3  赵六  45  20000  管理部
4  田七  31  11000  技术部

技术部员工:
    姓名  年龄     工资   部门
1  李四  32  12000  技术部
4  田七  31  11000  技术部

 复合条件筛选

import pandas as pd
import numpy as np

data = {
    '姓名': ['张三','李四','王五','赵六','田七'],
    '年龄': [25,32,28,45,31],
    '工资': [8000, 12000, 9500, 20000, 11000],
    '部门': ['市场部', '技术部', '市场部', '管理部', '技术部']
}
df = pd.DataFrame(data=data)

condition = (df['工资'] >= 10000) & (df['工资'] <= 15000) & (df['部门'] == '技术部')
filtered = df[condition]
print("\n工资10k-15k的技术部员工:\n", filtered)

#######################################################
工资10k-15k的技术部员工:
    姓名  年龄     工资   部门
1  李四  32  12000  技术部
4  田七  31  11000  技术部

使用query方法

import pandas as pd
import numpy as np

data = {
    '姓名': ['张三','李四','王五','赵六','田七'],
    '年龄': [25,32,28,45,31],
    '工资': [8000, 12000, 9500, 20000, 11000],
    '部门': ['市场部', '技术部', '市场部', '管理部', '技术部']
}
df = pd.DataFrame(data=data)

# 使用query方法进行筛选
filterd = df.query("年龄 > 30 and 部门 == '技术部'" )
print("\nquery方法筛选结果:\n",filterd)

# 使用变量进行动态查询
min_age = 30
filterd = df.query("年龄 > @min_age")

print("\n使用变量查询:\n", filterd)

#########################################
query方法筛选结果:
    姓名  年龄     工资   部门
1  李四  32  12000  技术部
4  田七  31  11000  技术部

使用变量查询:
    姓名  年龄     工资   部门
1  李四  32  12000  技术部
3  赵六  45  20000  管理部
4  田七  31  11000  技术部

 按列排序  

数据排序是数据分析中常用的操作,可以帮助我们快速发现数据模式和异常值。  

基本排序

import pandas as pd
import numpy as np

data = {
    '姓名': ['张三','李四','王五','赵六','田七'],
    '年龄': [25,32,28,45,31],
    '工资': [8000, 12000, 9500, 20000, 11000],
    '部门': ['市场部', '技术部', '市场部', '管理部', '技术部']
}
df = pd.DataFrame(data=data)

# 按工资升序排序
sorted_df = df.sort_values('工资')
print("\n按工资升序排序:\n", sorted_df)

# 按工资降序排序
sorted_df = df.sort_values('工资', ascending=False)
print("\n按工资降序排序:\n", sorted_df)

######################################
按工资升序排序:
    姓名  年龄     工资   部门
0  张三  25   8000  市场部
2  王五  28   9500  市场部
4  田七  31  11000  技术部
1  李四  32  12000  技术部
3  赵六  45  20000  管理部

按工资降序排序:
    姓名  年龄     工资   部门
3  赵六  45  20000  管理部
1  李四  32  12000  技术部
4  田七  31  11000  技术部
2  王五  28   9500  市场部
0  张三  25   8000  市场部

处理缺失值的排序

import pandas as pd
import numpy as np

data = {
    '姓名': ['张三','李四','王五','赵六','田七'],
    '年龄': [25,32,28,45,31],
    '工资': [8000, 12000, 9500, 20000, 11000],
    '部门': ['市场部', '技术部', '市场部', '管理部', '技术部']
}
df = pd.DataFrame(data=data)
# 创建含缺失值的数据,按标签索引选择数据
df_with_nan = df.copy()
print("\ncopy后数据\n",df_with_nan)
df_with_nan.loc[2,'工资'] = np.nan

# 默认排序(缺失值排在最后)
sorted_df = df_with_nan.sort_values('工资')
print("\n含缺失值的默认排序:\n", sorted_df)

# 缺失值排在最前
sorted_df = df_with_nan.sort_values('工资',na_position='first')
print("\n缺失值排在最前:\n",sorted_df)

#################################################
copy后数据
    姓名  年龄     工资   部门
0  张三  25   8000  市场部
1  李四  32  12000  技术部
2  王五  28   9500  市场部
3  赵六  45  20000  管理部
4  田七  31  11000  技术部

含缺失值的默认排序:
    姓名  年龄       工资   部门
0  张三  25   8000.0  市场部
4  田七  31  11000.0  技术部
1  李四  32  12000.0  技术部
3  赵六  45  20000.0  管理部
2  王五  28      NaN  市场部

缺失值排在最前:
    姓名  年龄       工资   部门
2  王五  28      NaN  市场部
0  张三  25   8000.0  市场部
4  田七  31  11000.0  技术部
1  李四  32  12000.0  技术部
3  赵六  45  20000.0  管理部

 按多列排序  

在实际分析中,我们经常需要按照多个标准进行排序。

基本多列排序

import pandas as pd
import numpy as np

data = {
    '姓名': ['张三','李四','王五','赵六','田七'],
    '年龄': [25,32,28,45,31],
    '工资': [8000, 12000, 9500, 20000, 11000],
    '部门': ['市场部', '技术部', '市场部', '管理部', '技术部']
}
df = pd.DataFrame(data=data)

# 先按部门升序,再按工资降序
sorted_df = df.sort_values(['部门','工资'],ascending=[True,False])
print("\n多列排序结果:\n",sorted_df)

##############################################
多列排序结果:
    姓名  年龄     工资   部门
2  王五  28   9500  市场部
0  张三  25   8000  市场部
1  李四  32  12000  技术部
4  田七  31  11000  技术部
3  赵六  45  20000  管理部

 复杂排序规则

# 自定义部门排序顺序
dept_order = {'管理部': 1, '技术部': 2, '市场部': 3}
df['部门_rank'] = df['部门'].map(dept_order)

# 按自定义部门顺序和工资排序
sorted_df = df.sort_values(['部门_rank', '工资'])
print("\n自定义排序规则结果:\n", sorted_df[['姓名', '部门', '工资']])

############################################

自定义排序规则结果:
    姓名   部门     工资
3  赵六  管理部  20000
4  田七  技术部  11000
1  李四  技术部  12000
0  张三  市场部   8000
2  王五  市场部   9500

按索引排序  

索引排序在处理时间序列数据或需要特定顺序时特别有用。

基本索引排序

# 创建乱序索引的DataFrame
shuffled_df = df.sample(frac=1, random_state=42)
print("\n原始乱序数据:\n", shuffled_df)

# 按索引排序
sorted_df = shuffled_df.sort_index()
print("\n按索引排序后:\n", sorted_df)

##########################################
原始乱序数据:
    姓名  年龄     工资   部门
1  李四  32  12000  技术部
4  田七  31  11000  技术部
2  王五  28   9500  市场部
0  张三  25   8000  市场部
3  赵六  45  20000  管理部

按索引排序后:
    姓名  年龄     工资   部门
0  张三  25   8000  市场部
1  李四  32  12000  技术部
2  王五  28   9500  市场部
3  赵六  45  20000  管理部
4  田七  31  11000  技术部

多级索引排序

import pandas as pd
import numpy as np

data = {
    '姓名': ['张三','李四','王五','赵六','田七'],
    '年龄': [25,32,28,45,31],
    '工资': [8000, 12000, 9500, 20000, 11000],
    '部门': ['市场部', '技术部', '市场部', '管理部', '技术部']
}
df = pd.DataFrame(data=data)

# 创建多级索引DataFrame
multi_df = df.set_index(['部门', '姓名'])
print("\n多级索引数据:\n", multi_df)

# 按多级索引排序
sorted_multi = multi_df.sort_index(level=['部门', '姓名'])
print("\n按多级索引排序后:\n", sorted_multi)

# 仅按部门排序
sorted_dept = multi_df.sort_index(level='部门')
print("\n仅按部门排序:\n", sorted_dept)
############################################
多级索引数据:
           年龄     工资
部门  姓名           
市场部 张三  25   8000
技术部 李四  32  12000
市场部 王五  28   9500
管理部 赵六  45  20000
技术部 田七  31  11000

按多级索引排序后:
          年龄     工资
部门  姓名           
市场部 张三  25   8000
    王五  28   9500
技术部 李四  32  12000
    田七  31  11000
管理部 赵六  45  20000

仅按部门排序:
         年龄     工资
部门  姓名           
市场部 张三  25   8000
    王五  28   9500
技术部 李四  32  12000
    田七  31  11000
管理部 赵六  45  20000    

高级筛选与排序技巧  

使用nlargest和nsmallest

# 获取工资最高的3名员工
top3 = df.nlargest(3, '工资')
print("\n工资最高的3名员工:\n", top3)

# 获取年龄最小的2名员工
youngest2 = df.nsmallest(2, '年龄')
print("\n年龄最小的2名员工:\n", youngest2)

###################################
工资最高的3名员工:
    姓名  年龄     工资   部门
3  赵六  45  20000  管理部
1  李四  32  12000  技术部
4  田七  31  11000  技术部

年龄最小的2名员工:
    姓名  年龄    工资   部门
0  张三  25  8000  市场部
2  王五  28  9500  市场部

使用between筛选范围  

# 筛选年龄在25-35岁之间的员工
age_range = df[df['年龄'].between(25, 35)]
print("\n25-35岁之间的员工:\n", age_range)

########################################
25-35岁之间的员工:
    姓名  年龄     工资   部门
0  张三  25   8000  市场部
1  李四  32  12000  技术部
2  王五  28   9500  市场部
4  田七  31  11000  技术部

使用isin筛选多个值

# 筛选市场部和技术部的员工
depts = ['市场部', '技术部']
filtered = df[df['部门'].isin(depts)]
print("\n市场部和技术部员工:\n", filtered)

##############################

市场部和技术部员工:
    姓名  年龄     工资   部门
0  张三  25   8000  市场部
1  李四  32  12000  技术部
2  王五  28   9500  市场部
4  田七  31  11000  技术部

总结

操作类型方法适用场景
条件筛选 df[条件]query() 基于逻辑条件提取数据子集
单列排序 sort_values() 按单个关键指标排序
多列排序 sort_values([列1,列2]) 需要多个排序标准时
索引排序 sort_index() 按索引排序,特别适合时间序列
高级筛选 nlargest()between() 快速获取极值或范围数据

最佳实践建议

  1. 筛选大数据集时,使用query()方法通常比布尔索引更高效 

  2. 多列排序时,合理安排列顺序和升降序可以快速定位关键数据 

  3. 对排好序的数据使用reset_index(drop=True)可以重置索引 

  4. 处理时间数据时,先确保索引是时间类型再排序