Pandas多级索引DataFrame:计算各年份结果均值并添加相对偏差列
Pandas多级索引DataFrame:计算各年份结果均值并添加相对偏差列
嘿,这个需求用Pandas的多级索引操作就能轻松搞定,我给你一步步拆解怎么做:
1. 先把文本数据转换成真正的多级索引DataFrame
如果你还没把原始数据转成Pandas的DataFrame,先执行这段代码来构造和你示例一致的结构:
import pandas as pd # 构建多级列索引 columns = pd.MultiIndex.from_tuples([ ('2024', 'N'), ('2024', 'Result'), ('2024', 'SD'), ('2023', 'N'), ('2023', 'Result'), ('2023', 'SD'), ('2022', 'N'), ('2022', 'Result'), ('2022', 'SD') ]) # 填入数据 data = [ [5, 20, 3, 5, 22, 4, 1, 21, 3], [4, 25, 2, 4, 25, 3, 4, 26, 5], [9, 22, 3, 9, 27, 1, 3, 23, 3], [3, 23, 5, 3, 16, 2, 5, 13, 4], [5, 27, 2, 5, 21, 3, 3, 19, 5] ] df = pd.DataFrame(data, index=['A', 'B', 'C', 'D', 'E'], columns=columns) df.index.name = 'Vendor'
2. 计算每个年份的Result均值
我们可以通过多级索引的xs方法提取所有年份的Result列,然后求每一列的均值:
# 提取所有年份的Result列,计算各年份均值 year_result_means = df.xs('Result', level=1, axis=1).mean()
比如2024年的均值就是(20+25+22+23+27)/5 = 23.4,和你示例里A的偏差20/23.4*100≈85.5完全对应。
3. 计算相对偏差并添加新列
遍历每个年份,计算每个Vendor的Result值相对于该年份均值的偏差,然后把偏差列插入到对应年份的列组中:
# 遍历每个年份,计算偏差并添加列 for year in year_result_means.index: # 计算偏差:(Result值 / 年份均值) * 100,保留1位小数 deviation = (df[(year, 'Result')] / year_result_means[year]) * 100 df[(year, 'Deviation')] = deviation.round(1)
4. 调整列的顺序(可选)
如果你想让Deviation列紧跟在SD后面,和你示例的结构一致,可以重新整理列顺序:
# 重新排列列,确保每个年份下的顺序是N → Result → SD → Deviation sorted_columns = [] for year in ['2024', '2023', '2022']: sorted_columns.extend([(year, 'N'), (year, 'Result'), (year, 'SD'), (year, 'Deviation')]) df = df[sorted_columns]
最终效果
执行完上面的代码后,打印df就能得到你想要的结果:
Year 2024 2023 2022 Header N Result SD Deviation N Result SD Deviation N Result SD Deviation Vendor A 5 20 3 85.5 5 22 4 99.1 1 21 3 112.9 B 4 25 2 106.8 4 25 3 112.6 4 26 5 140.9 C 9 22 3 94.0 9 27 1 121.4 3 23 3 124.7 D 3 23 5 98.3 3 16 2 71.9 5 13 4 70.4 E 5 27 2 115.4 5 21 3 94.6 3 19 5 103.2
备注:内容来源于stack exchange,提问作者Tumas04
相关产品推荐
相关产品推荐

