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() 快速获取极值或范围数据

最佳实践建议

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

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

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

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

 

posted @ 2026-01-14 11:19  梦徒  阅读(25)  评论(0)    收藏  举报