跨多独立DataFrame行均值计算及按问题维度绘图方案咨询
数据处理与可视化实现步骤
第一步:计算每个DataFrame的行平均得分
所有待处理的DataFrame默认行索引为问题编号(Q1/Q2/...),列索引为1~n的数值维度,直接对每行的数值列求均值即可,示例代码如下:
import pandas as pd # 假设你已将4个待处理DataFrame存入如下列表 dfs = [df1, df2, df3, df4] # 遍历每个DataFrame新增average列存储行均值 for df in dfs: # 仅对数值列求均值,自动忽略非数值的索引相关内容 df['average'] = df.mean(axis=1, numeric_only=True)
注:如果需要保留缺失值对均值的影响(即该行有一个空值则均值为空),可以在
mean方法中添加参数skipna=False。
第二步:按问题维度生成折线图并标注百分比变化
先汇总所有问题在各个DataFrame中的平均得分,再逐个问题绘图。对同时出现在第一个和最后一个DataFrame中的问题,额外计算从首到尾的平均得分百分比变化并标注在图中,完整实现代码如下:
import matplotlib.pyplot as plt from collections import defaultdict # 1. 汇总所有问题的均值数据 q_avg_dict = defaultdict(list) all_ques = set() for df in dfs: all_ques.update(df.index.tolist()) all_ques = sorted(all_ques) for q in all_ques: for df in dfs: q_avg_dict[q].append(df.loc[q, 'average'] if q in df.index else None) # 2. 逐个问题绘图 for q, avg_list in q_avg_dict.items(): # 过滤掉无数据的位置,保留有值的点和对应的df序号 x = [i+1 for i, val in enumerate(avg_list) if val is not None] y = [val for val in avg_list if val is not None] if len(y) < 2: # 少于2个数据点无法绘制有效折线,可根据需求调整是否跳过 continue plt.figure(figsize=(8,4)) plt.plot(x, y, marker='o', linewidth=2, label=f'{q}平均得分') plt.title(f'{q}各阶段平均得分变化') plt.xlabel('DataFrame序号') plt.ylabel('平均得分') plt.xticks(range(1, len(dfs)+1)) plt.grid(alpha=0.3) # 判断是否同时在第一个和最后一个df中存在,计算并标注百分比变化 if avg_list[0] is not None and avg_list[-1] is not None: first_avg = avg_list[0] last_avg = avg_list[-1] change_pct = ((last_avg - first_avg) / first_avg) * 100 # 在图的右上角标注变化率 plt.text(0.95, 0.95, f'首→尾变化率: {change_pct:.2f}%', transform=plt.gca().transAxes, ha='right', va='top', bbox=dict(facecolor='white', alpha=0.8)) plt.legend() plt.show()
如果需要调整图表样式、标注位置或者批量导出图片,直接修改对应matplotlib参数即可。
内容的提问来源于stack exchange,提问作者S44
相关产品推荐
相关产品推荐

