如何将 CSV 数据读入 NumPy 中的记录数组?

2024-12-13 08:37:00
admin
原创
158
摘要:问题描述:是否有直接的方法将 CSV 文件的内容导入记录数组,就像 R 的read.table()、read.delim()和read.csv()将数据导入 R 数据框一样?或者我应该使用csv.reader()然后申请numpy.core.records.fromrecords()?解决方案 1:numpy...

问题描述:

是否有直接的方法将 CSV 文件的内容导入记录数组,就像 R 的read.table()read.delim()read.csv()将数据导入 R 数据框一样?

或者我应该使用csv.reader()然后申请numpy.core.records.fromrecords()


解决方案 1:

numpy.genfromtxt()通过将delimiterkwarg 设置为逗号来使用:

from numpy import genfromtxt
my_data = genfromtxt('my_file.csv', delimiter=',')

解决方案 2:

使用pandas.read_csv

import pandas as pd
df = pd.read_csv('myfile.csv', sep=',', header=None)
print(df.values)
array([[ 1. ,  2. ,  3. ],
       [ 4. ,  5.5,  6. ]])

这为 pandasDataFrame提供了许多有用的数据操作函数,而这些函数无法通过 numpy 记录数组直接使用。

DataFrame是一个二维标记数据结构,其列可能具有不同类型的类型。您可以将其视为电子表格或 SQL 表...


我也会推荐numpy.genfromtxt。但是,由于问题要求记录数组,而不是普通数组,因此dtype=None需要在调用中添加参数genfromtxt

import numpy as np
np.genfromtxt('myfile.csv', delimiter=',')

对于以下内容'myfile.csv'

1.0, 2, 3
4, 5.5, 6

上面的代码给出了一个数组:

array([[ 1. ,  2. ,  3. ],
       [ 4. ,  5.5,  6. ]])

np.genfromtxt('myfile.csv', delimiter=',', dtype=None)

给出一个记录数组:

array([(1.0, 2.0, 3), (4.0, 5.5, 6)], 
      dtype=[('f0', '<f8'), ('f1', '<f8'), ('f2', '<i4')])

这样做的好处是可以轻松导入具有多种数据类型(包括字符串)的文件。

解决方案 3:

我试过了:

from numpy import genfromtxt
genfromtxt(fname = dest_file, dtype = (<whatever options>))

相对 :

import csv
import numpy as np
with open(dest_file,'r') as dest_f:
    data_iter = csv.reader(dest_f,
                           delimiter = delimiter,
                           quotechar = '"')
    data = [data for data in data_iter]
data_array = np.asarray(data, dtype = <whatever options>)

对 460 万行、约 70 列的数据进行测试,发现 NumPy 路径花费了 2 分 16 秒,而 csv-list 理解方法花费了 13 秒。

我推荐使用 csv-list 理解方法,因为它最有可能依赖于预编译库,而不是像 NumPy 那样依赖于解释器。我怀疑 pandas 方法会有类似的解释器开销。

解决方案 4:

您还可以尝试recfromcsv()猜测数据类型并返回格式正确的记录数组。

解决方案 5:

当我尝试使用 NumPy 和 Pandas 两种方法时,我发现使用 Pandas 有很多优点:

  • 快点

  • 更少的 CPU 使用率

  • 与 NumPy genfromtxt 相比,RAM 使用量为 1/3

这是我的测试代码:

$ for f in test_pandas.py test_numpy_csv.py ; do  /usr/bin/time python $f; done
2.94user 0.41system 0:03.05elapsed 109%CPU (0avgtext+0avgdata 502068maxresident)k
0inputs+24outputs (0major+107147minor)pagefaults 0swaps

23.29user 0.72system 0:23.72elapsed 101%CPU (0avgtext+0avgdata 1680888maxresident)k
0inputs+0outputs (0major+416145minor)pagefaults 0swaps

测试numpy_csv

from numpy import genfromtxt
train = genfromtxt('/home/hvn/me/notebook/train.csv', delimiter=',')

测试pandas.py

from pandas import read_csv
df = read_csv('/home/hvn/me/notebook/train.csv')

数据文件:

du -h ~/me/notebook/train.csv
 59M    /home/hvn/me/notebook/train.csv

NumPy 和 pandas 的版本如下:

$ pip freeze | egrep -i 'pandas|numpy'
numpy==1.13.3
pandas==0.20.2

解决方案 6:

使用numpy.loadtxt

一个相当简单的方法。但它要求所有元素都是浮点数(int 等)

import numpy as np 
data = np.loadtxt('c:\\1.csv',delimiter=',',skiprows=0)  

解决方案 7:

您可以使用此代码将 CSV 文件数据发送到数组中:

import numpy as np
csv = np.genfromtxt('test.csv', delimiter=",")
print(csv)

解决方案 8:

这项工作很有魅力......

import csv
with open("data.csv", 'r') as f:
    data = list(csv.reader(f, delimiter=";"))

import numpy as np
data = np.array(data, dtype=np.float)

解决方案 9:

这是最简单的方法:

import csv
with open('testfile.csv', newline='') as csvfile:
    data = list(csv.reader(csvfile))

现在,数据中的每个条目都是一条记录,以数组表示。所以你有一个二维数组。它为我节省了很多时间。

解决方案 10:

我建议使用表格(pip3 install tables)。您可以使用 pandas( )保存.csv文件,.h5`pip3 install pandas`

import pandas as pd
data = pd.read_csv("dataset.csv")
store = pd.HDFStore('dataset.h5')
store['mydata'] = data
store.close()

然后,您可以轻松地将数据加载到NumPy 数组中,即使数据量巨大,也能花费更少的时间。

import pandas as pd
store = pd.HDFStore('dataset.h5')
data = store['mydata']
store.close()

# Data in NumPy format
data = data.values

解决方案 11:

可在最新的 pandas 和 numpy 版本上使用。

import pandas as pd
import numpy as np

data = pd.read_csv('data.csv', header=None)

# Discover, visualize, and preprocess data using pandas if needed.

data = data.to_numpy()

解决方案 12:

我尝试过这个:

import pandas as p
import numpy as n

closingValue = p.read_csv("<FILENAME>", usecols=[4], dtype=float)
print(closingValue)

解决方案 13:

In [329]: %time my_data = genfromtxt('one.csv', delimiter=',')
CPU times: user 19.8 s, sys: 4.58 s, total: 24.4 s
Wall time: 24.4 s

In [330]: %time df = pd.read_csv("one.csv", skiprows=20)
CPU times: user 1.06 s, sys: 312 ms, total: 1.38 s
Wall time: 1.38 s

解决方案 14:

这是一个非常简单的任务,最好的方法如下

import pandas as pd
import numpy as np


df = pd.read_csv(r'C:UsersRonDesktopClients.csv')   #read the file (put 'r' before the path string to address any special characters in the file such as ). Don't forget to put the file name at the end of the path + ".csv"

print(df)`

y = np.array(df)
相关推荐
  政府信创国产化的10大政策解读一、信创国产化的背景与意义信创国产化,即信息技术应用创新国产化,是当前中国信息技术领域的一个重要发展方向。其核心在于通过自主研发和创新,实现信息技术应用的自主可控,减少对外部技术的依赖,并规避潜在的技术制裁和风险。随着全球信息技术竞争的加剧,以及某些国家对中国在科技领域的打压,信创国产化显...
工程项目管理   1565  
  为什么项目管理通常仍然耗时且低效?您是否还在反复更新电子表格、淹没在便利贴中并参加每周更新会议?这确实是耗费时间和精力。借助软件工具的帮助,您可以一目了然地全面了解您的项目。如今,国内外有足够多优秀的项目管理软件可以帮助您掌控每个项目。什么是项目管理软件?项目管理软件是广泛行业用于项目规划、资源分配和调度的软件。它使项...
项目管理软件   1354  
  信创国产芯片作为信息技术创新的核心领域,对于推动国家自主可控生态建设具有至关重要的意义。在全球科技竞争日益激烈的背景下,实现信息技术的自主可控,摆脱对国外技术的依赖,已成为保障国家信息安全和产业可持续发展的关键。国产芯片作为信创产业的基石,其发展水平直接影响着整个信创生态的构建与完善。通过不断提升国产芯片的技术实力、产...
国产信创系统   21  
  信创生态建设旨在实现信息技术领域的自主创新和安全可控,涵盖了从硬件到软件的全产业链。随着数字化转型的加速,信创生态建设的重要性日益凸显,它不仅关乎国家的信息安全,更是推动产业升级和经济高质量发展的关键力量。然而,在推进信创生态建设的过程中,面临着诸多复杂且严峻的挑战,需要深入剖析并寻找切实可行的解决方案。技术创新难题技...
信创操作系统   27  
  信创产业作为国家信息技术创新发展的重要领域,对于保障国家信息安全、推动产业升级具有关键意义。而国产芯片作为信创产业的核心基石,其研发进展备受关注。在信创国产芯片的研发征程中,面临着诸多复杂且艰巨的难点,这些难点犹如一道道关卡,阻碍着国产芯片的快速发展。然而,科研人员和相关企业并未退缩,积极探索并提出了一系列切实可行的解...
国产化替代产品目录   28  
热门文章
项目管理软件有哪些?
云禅道AD
禅道项目管理软件

云端的项目管理软件

尊享禅道项目软件收费版功能

无需维护,随时随地协同办公

内置subversion和git源码管理

每天备份,随时转为私有部署

免费试用