Python数据分析利器-Pandas数据处理-筛选与排序
条件筛选(布尔索引)
布尔索引是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() |
快速获取极值或范围数据 |
最佳实践建议
-
筛选大数据集时,使用query()方法通常比布尔索引更高效
-
多列排序时,合理安排列顺序和升降序可以快速定位关键数据
-
对排好序的数据使用reset_index(drop=True)可以重置索引
-
处理时间数据时,先确保索引是时间类型再排序

浙公网安备 33010602011771号