如何在Pandas DataFrame中按多条件(含或/且)生成定制透视表
Pandas定制化透视表+多条件筛选解决方案
示例输入数据
假设你的原始数据结构如下(可替换为实际业务数据):
import pandas as pd import numpy as np data = { '部门': ['销售', '销售', '研发', '研发', '行政', '行政'], '职级': ['初级', '高级', '初级', '高级', '初级', '高级'], '性别': ['男', '女', '男', '女', '男', '女'], '薪资': [8000, 15000, 9000, 18000, 7500, 12000], '绩效评分': [85, 92, 88, 95, 82, 89] } df = pd.DataFrame(data)
1. 实现AND/OR多条件筛选
直接用布尔索引搞定,注意逻辑运算符用&(AND)、|(OR),每个条件必须加括号:
- AND逻辑:同时满足多个条件
# 筛选:销售部门 AND 高级职级 filter_and = (df['部门'] == '销售') & (df['职级'] == '高级') df_filtered_and = df[filter_and] - OR逻辑:满足任意一个条件
# 筛选:销售部门 OR 高级职级 filter_or = (df['部门'] == '销售') | (df['职级'] == '高级') df_filtered_or = df[filter_or] - 嵌套复杂逻辑:混合AND/OR的组合条件
# 筛选:(销售部门且薪资超1万) 或者 (研发部门且绩效超90) filter_complex = ((df['部门'] == '销售') & (df['薪资'] > 10000)) | ((df['部门'] == '研发') & (df['绩效评分'] > 90)) df_complex = df[filter_complex]
2. 生成定制化透视表
用pd.pivot_table()可以灵活指定分组维度、计算字段、统计方法,支持同时计算均值、中位数等多种指标:
示例1:筛选后按部门+职级分组,计算薪资的均值/中位数、绩效的均值
# 先应用OR筛选 df_filtered = df[(df['部门'] == '销售') | (df['职级'] == '高级')] pivot_table = pd.pivot_table( df_filtered, index=['部门', '职级'], # 行分组维度 values=['薪资', '绩效评分'], # 要计算的字段 aggfunc={ '薪资': ['mean', 'median'], # 薪资同时算均值和中位数 '绩效评分': 'mean' # 绩效只算均值 }, margins=True, # 显示总计行 margins_name='总计' ) print(pivot_table)
示例2:AND筛选后按性别分组,计算薪资的多维度统计
df_filtered_and = df[(df['部门'] == '研发') & (df['绩效评分'] > 90)] pivot_table_and = pd.pivot_table( df_filtered_and, index='性别', values='薪资', aggfunc=['mean', 'median', 'max', 'min'], # 同时计算均值、中位数、最大最小值 fill_value=0 # 空值填充为0 ) print(pivot_table_and)
示例3:自定义聚合函数
如果需要默认没有的统计值(比如90分位数),可以自定义函数传入:
# 自定义函数:计算90分位数 def q90(x): return x.quantile(0.9) pivot_custom = pd.pivot_table( df, index='部门', values='薪资', aggfunc=['mean', q90] # 同时计算均值和90分位数 ) print(pivot_custom)
内容的提问来源于stack exchange,提问作者WUPD
相关产品推荐
相关产品推荐

