python - 使用 panda 或 numpy 从一个 csv 加载多个数据帧
问题描述
我有一个 csv 文件,其中包含由模拟(索引)条目分隔的多个模拟。每个条目都有一条时间线和 3 条特征线。基本上第一列只有模拟(索引)条目,而第二列只有模拟的“标题”(时间+特征1,n),然后只有数值。
我想将其包含在某些数据帧或某种 numpy 数组中,以便为每个模拟绘制图表,并且显然可以更好地掌握数据。
作为对这类挑战相当陌生的人,我求助于 pandas 来寻求快速解决方案,但我也对任何 python(numpy/其他库)实现持开放态度。
数据格式示例:
谢谢
解决方案
您的数据示例看起来像 Excel,所以我尝试使用 Excel 表并使用了 pandas 的 read_excel(CSV 有类似的命令):
import numpy as np
import pandas as pd
import matplotlib.pyplot as plt
df0 = pd.read_excel('testdata.xlsx',header=None)
df0.head()
给
0 1 2 3 4 5 6 7 8 9 10 11 12
0 sim1 time 1 2 3 4 5 6 7 8 9 10 11
1 NaN feat1 1 0 -1 0 1 0 -1 0 1 0 -1
2 NaN feat2 2 0 -2 0 2 0 -2 0 2 0 -2
3 NaN feat3 3 0 -3 0 3 0 -3 0 3 0 -3
4 sim2 time 1 2 3 4 5 6 7 8 9 10 11
您可以将 1 个模型的数据提取为 pandas 数据框或 numpy 数组:
def get_data_numpy(df,j):
i = j * (nFeats+1)
t = np.array(df.iloc[i,2:])
y0 = np.array(df.iloc[i+1,2:])
y1 = np.array(df.iloc[i+2,2:])
y2 = np.array(df.iloc[i+3,2:])
return t,y0,y1,y2
def get_data_pandas(df,j):
i = j * (nFeats+1)
t = np.array(df.iloc[i,2:])
dfy = df.iloc[i+1:i+nFeats+1,2:]
return t,dfy
nModels = 1 # run for 1 model
nFeats = 3
for jModel in range(nModels):
tn,y0,y1,y2 = get_data_numpy(df0,jModel)
tp,dfy = get_data_pandas(df0,jModel)
#--- graphics ---
plt.style.use('fast')
fig, ax0 = plt.subplots(figsize=(20,4))
plt.plot(tp,dfy.T, lw=4, alpha=0.4); # plot pandas dfy with 1 command
plt.plot(tn,-y0,lw=6,ls='--') # plot each numpy time series
plt.plot(tn,-y1,lw=6,ls=':')
plt.plot(tn,-y2,lw=6,ls='-')
plt.show()
fig.savefig('plot_model_1.png', transparency=True)
给
在数据显示 ( df0.head()
) 和图中,仅显示第一个模型。设置为nModels
大于 1 的数字,您可以运行所有模型。
推荐阅读
- javascript - 在数组中分组子数组
- python-3.x - 使用 Python 和 Boto 3 在同一存储桶中复制 S3 对象
- c# - 403 禁止错误 | IIS 10.0 | 如果内容长度 > 102400 则失败
- r - 是否有方便计算的 R 函数?
- c++ - 如何通过预处理器指令而不是命令行选项启用 GCC 编译器标志?
- symfony - 如何覆盖 FOSUserBundle 的登录表单
- python - 熊猫数据框用两条线绘制折线图
- python - Flask-Mail 可以制作草稿吗?
- java - 如何使用redisson客户端获取当前时间
- c++ - 如何评估这个 C++ 表达式?