【问题标题】:Numpy: load multiple CSV files as dictionariesNumpy:将多个 CSV 文件加载为字典
【发布时间】:2019-07-13 00:32:29
【问题描述】:

我想使用numpy loadtxt method 来读取.csv 文件以进行我的实验。我有以下三种不同的时间序列数据,它们具有不同的特征,其中第一列是时间戳,第二列是值。

0.086206438,10
0.086425551,12
0.089227066,20
0.089262508,24
0.089744425,30
0.090036815,40
0.090054172,28
0.090377569,28
0.090514071,28
0.090762872,28
0.090912691,27

为了重现性,我分享了我使用的三个时间序列数据here

如果我这样做

import numpy as np

fname="data1.csv"

col_time,col_window = np.loadtxt(fname,delimiter=',').T

它按预期工作。但是,我不想只读取单个文件,而是想将字典传递给col_time,col_window = np.loadtxt(types,delimiter=',').T,如下所示

protocols = {} types = {"data1": "data1.csv", "data2": "data2.csv", "data3": "data3.csv"}

这样我就可以读取多个csv 文件,并使用一个for loop 将所有结果绘制在一个for loop 上,如下所示。

for protname, fname in types.items():
    col_time, col_window = protocols[protname]["col_time"], protocols[protname]["col_window"]
    rt = np.exp(np.diff(np.log(col_window)))
    plt.plot(quotient_times, quotient, ".", markersize=4, label=protname)
    plt.title(protname)
    plt.xlabel("t")
    plt.ylabel("values")
    plt.legend()
    plt.show()

但它给了我一个错误ValueError: could not convert string to float: b'data1'。如何将多个 csv 文件加载为字典?

【问题讨论】:

  • loadtxt 仅适用于一个文件。您必须加载每一个并适当地加入数据。

标签: python python-3.x csv numpy dictionary


【解决方案1】:

假设您要构建一个可在您的代码中使用的protocols dict,您可以使用简单的循环轻松构建它:

types = {"data1": "data1.csv", "data2": "data2.csv", "data3": "data3.csv"}
protocols = {}

for name, file in types.items():
    col_time, col_window = np.loadtxt(file, delimiter=',').T
    protocols[name] = {'col_time': col_time, 'col_window': col_window}

然后您可以成功绘制 3 个图表:

for protname, fname in types.items():
    col_time, col_window = protocols[protname]["col_time"], protocols[protname]["col_window"]
    rt = np.exp(np.diff(np.log(col_window)))
    plt.plot(col_time, col_window, ".", markersize=4, label=protname)
    plt.title(protname)
    plt.xlabel("t")
    plt.ylabel("values")
    plt.legend()
    plt.show()

【讨论】:

  • @Brown:在循环结束时,一个变量会保留它在循环内收到的最后一个值。但是在运行循环时,它会收到所有预期值。使用您的示例数据,我可以显示 3 个不同的图表。
【解决方案2】:

pandas 和 numpy 不支持从多个 CSV 文件加载数据。您可以使用熊猫DataFrameconcat 函数并加载所有文件。下面的示例演示了如何使用 pandas。将StringIO 替换为文件对象。

data="""
0.086206438,10
0.086425551,12
0.089227066,20
0.089262508,24
0.089744425,30
0.090036815,40
0.090054172,28
0.090377569,28
0.090514071,28
0.090762872,28
0.090912691,27
"""
data2="""
0.086206438,29
0.086425551,32
0.089227066,50
0.089262508,54
"""
data3="""
0.086206438,69
0.086425551,72
0.089227066,70
0.089262508,74
"""
import pandas as pd
from io import StringIO
files={"data1":data,"data2":data2,"data3":data3}
# Load the first file into data frame
key=list(files.keys())[0]
df=pd.read_csv(StringIO(files.get(key)),header=None,usecols=[0,1],names=['data1','data2'])
print(df.head())
# remove file from dictionary
files.pop(key,None)
print("final values")
# Efficient :Concat this dataframe with remaining files
df=pd.concat([pd.read_csv(StringIO(files[i]),header=None,usecols=[0,1],names=['data1','data2']) for i in files.keys()],
           ignore_index=True)
print(df.tail())

更多见解:pandas append vs concat

【讨论】:

    猜你喜欢
    • 2020-01-13
    • 2020-12-27
    • 1970-01-01
    • 2014-04-12
    • 2015-06-24
    • 1970-01-01
    • 2017-03-27
    • 2013-08-22
    • 1970-01-01
    相关资源
    最近更新 更多