我有一个如下所示的CSV数据集:
FirstAge,SecondAge,FirstCountry,SecondCountry,Income,NAME
41,41,USA,UK,113764,John
53,43,USA,USA,145963,Fred
47,37,USA,UK,42857,Dan
47,44,UK,USA,95352,Mark
我正在尝试使用以下代码将其加载到Python 3.6中:
>>> from numpy import genfromtxt
>>> my_data = genfromtxt('first.csv', delimiter=',')
>>> print(train_data)
输出:
[[ nan nan nan nan
nan nan]
[ 4.10000000e+01 4.10000000e+01 nan nan
1.13764000e+05 nan]
[ 5.30000000e+01 4.30000000e+01 nan nan
1.45963000e+05 nan]
...,
[ 2.10000000e+01 3.00000000e+01 nan nan
1.19929000e+05 nan]
[ 6.90000000e+01 6.40000000e+01 nan nan
1.52667000e+05 nan]
[ 2.00000000e+01 1.90000000e+01 nan nan
1.05077000e+05 nan]]
我查看了Numpy文档,但我没有看到任何相关内容。
答案 0 :(得分:2)
使用pandas
,它将为您省去麻烦:
import pandas as pd
df = pd.read_csv('first.csv')
print(df)
答案 1 :(得分:1)
使用pandas
的替代方法是使用csv
库
import csv
import numpy as np
ls = list(csv.reader(open('first.csv', 'r')))
val_array = np.array(ls)[1::] # exclude first row (columns name)
答案 2 :(得分:1)
您可以使用dtype
参数:
import numpy as np
output = np.genfromtxt("main.csv", delimiter=',', skip_header=1, dtype='f, f, |S6, |S6, f, |S6')
print(output)
输出:
[( 41., 41., b'USA', b'UK', 113764., b'John')
( 53., 43., b'USA', b'USA', 145963., b'Fred')
( 47., 37., b'USA', b'UK', 42857., b'Dan')
( 47., 44., b'UK', b'USA', 95352., b'Mark')]
答案 3 :(得分:1)
有一些通用参数genfromtxt
可以读取此文件(在PY3中):
In [100]: data = np.genfromtxt('stack43444219.txt', delimiter=',', names=True, dtype=None)
In [101]: data
Out[101]:
array([(41, 41, b'USA', b'UK', 113764, b'John'),
(53, 43, b'USA', b'USA', 145963, b'Fred'),
(47, 37, b'USA', b'UK', 42857, b'Dan'),
(47, 44, b'UK', b'USA', 95352, b'Mark')],
dtype=[('FirstAge', '<i4'), ('SecondAge', '<i4'), ('FirstCountry', 'S3'), ('SecondCountry', 'S3'), ('Income', '<i4'), ('NAME', 'S4')])
这是一个结构化数组。 2个字段是整数,2个是字符串(默认为字节字符串),另一个是整数和字符串。
默认genfromtxt
将所有行读作数据。我使用names=True
来使用字段名称的第一行。
它还尝试读取所有字符串float(默认dtype)。然后字符串列加载为nan
。
所有这些都在genfromtxt
文档中。不可否认,它们很长,但它们并不难找到。
按名称data['FirstName']
等访问字段
使用csv
阅读器提供了一个2d字符串数组:
In [102]: ls =list(csv.reader(open('stack43444219.txt','r')))
In [103]: ls
Out[103]:
[['FirstAge', 'SecondAge', 'FirstCountry', 'SecondCountry', 'Income', 'NAME'],
['41', '41', 'USA', 'UK', '113764', 'John'],
['53', '43', 'USA', 'USA', '145963', 'Fred'],
['47', '37', 'USA', 'UK', '42857', 'Dan'],
['47', '44', 'UK', 'USA', '95352', 'Mark']]
In [104]: arr=np.array(ls)
In [105]: arr
Out[105]:
array([['FirstAge', 'SecondAge', 'FirstCountry', 'SecondCountry', 'Income',
'NAME'],
['41', '41', 'USA', 'UK', '113764', 'John'],
['53', '43', 'USA', 'USA', '145963', 'Fred'],
['47', '37', 'USA', 'UK', '42857', 'Dan'],
['47', '44', 'UK', 'USA', '95352', 'Mark']],
dtype='<U13')
答案 4 :(得分:-1)
我认为您可能遇到的一个问题是您尝试解析的数据并非全是数字,这可能会导致意外行为。
检测类型的一种方法是在将类型添加到数组之前尝试识别它们。例如:
for obj in my_data:
if type(obj) == int:
# process or add your data to numpy
else:
# cast or discard the data