如何绘制Pandas DataFrame列中的NumPy数组并计算其平均值?
问题描述
给定如下DataFrame:
import pandas as pd import numpy as np df = pd.DataFrame({ 'sample_type': ['A', 'A', 'A'], 'observed_data': [ np.array([0.2, 0.5, 0.17, 0.1]), np.array([0.9, 0.3, 0.24, 0.5]), np.array([0.9, 0.5, 0.6, 0.39]) ] })
其中observed_data列的数据类型为np.array,需求如下:
- 将每个独立的np.array绘制成单独曲线,比较类型为'A'的样本的观测数据轨迹;
- 计算
observed_data列所有行的平均值并绘制该平均曲线(例如期望得到平均数组avg = [0.666, 0.433, 0.336, 0.33])。
一、绘制单个样本曲线
使用matplotlib遍历样本数据逐个绘图,代码如下:
import matplotlib.pyplot as plt # 筛选出样本类型为'A'的数据 df_a = df[df['sample_type'] == 'A'] plt.figure(figsize=(8, 5)) # 遍历每一行数据绘制曲线 for idx, row in df_a.iterrows(): data = row['observed_data'] plt.plot(data, label=f'Sample {idx+1}') plt.xlabel('时间/步数') plt.ylabel('观测值') plt.title('类型A样本的观测数据轨迹') plt.legend() plt.grid(True) plt.show()
这段代码会为每个样本生成一条独立曲线,通过图例区分不同样本,网格和坐标轴标签让图表更易读。
二、计算平均值并绘制平均曲线
通过np.stack将所有一维数组合并为二维矩阵,再按列求均值,代码如下:
# 将所有观测数组合并为二维数组 all_data = np.stack(df_a['observed_data'].values) # 按列计算每个位置的平均值 avg_data = np.mean(all_data, axis=0) # 保留三位小数匹配示例结果 avg_data = np.round(avg_data, 3) print(f'平均数组: {avg_data}') # 输出: 平均数组: [0.667 0.433 0.337 0.33 ] # 叠加绘制单个样本曲线与平均曲线 plt.figure(figsize=(8, 5)) # 单个样本曲线设为半透明 for idx, row in df_a.iterrows(): plt.plot(row['observed_data'], label=f'Sample {idx+1}', alpha=0.5) # 平均曲线加粗突出 plt.plot(avg_data, label='平均轨迹', color='red', linewidth=2) plt.xlabel('时间/步数') plt.ylabel('观测值') plt.title('类型A样本的观测数据轨迹与平均值') plt.legend() plt.grid(True) plt.show()
np.stack能快速将分散的一维数组整合为可批量计算的二维矩阵,axis=0参数确保我们计算的是每个时间步的跨样本平均值。半透明的样本曲线搭配突出的平均曲线,能清晰对比整体趋势与个体差异。
内容的提问来源于stack exchange,提问作者MAtennis9
相关产品推荐
相关产品推荐

