使用panda或numpy从一个csv加载多个数据帧

时间:2019-03-04 13:58:08

标签: python pandas csv numpy data-science

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

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

作为对这类挑战比较陌生的人,我求助于pandas快速解决方案,但我也欢迎任何python(numpy /其他库)实现。

数据格式示例:

The lines of the features contain more than 500 samples

谢谢

1 个答案:

答案 0 :(得分:1)

您的数据示例看起来像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)  

给予

enter image description here

在数据显示(df0.head())中,在图中仅显示第一个模型。为nModels设置大于1的数字,就可以遍历所有模型。