首页 > 解决方案 > 使用 panda 或 numpy 从一个 csv 加载多个数据帧

问题描述

我有一个 csv 文件,其中包含由模拟(索引)条目分隔的多个模拟。每个条目都有一条时间线和 3 条特征线。基本上第一列只有模拟(索引)条目,而第二列只有模拟的“标题”(时间+特征1,n),然后只有数值。

我想将其包含在某些数据帧或某种 numpy 数组中,以便为每个模拟绘制图表,并且显然可以更好地掌握数据。

作为对这类挑战相当陌生的人,我求助于 pandas 来寻求快速解决方案,但我也对任何 python(numpy/其他库)实现持开放态度。

数据格式示例:

特征线包含超过 500 个样本

谢谢

标签: pythonpandascsvnumpydata-science

解决方案


您的数据示例看起来像 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 的数字,您可以运行所有模型。


推荐阅读