[英]Importing CSV into Python
我有一個如下所示的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文檔,對此一無所獲。
和pandas
去,可以為您省去麻煩:
import pandas as pd
df = pd.read_csv('first.csv')
print(df)
使用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)
您可以使用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')]
通過一些常規參數, 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
來使用字段名稱的第一行。
它還嘗試以浮點數(默認dtype)讀取所有字符串。 然后,將字符串列加載為nan
。
所有這些都在genfromtxt
文檔中。 誠然,它們很長,但並不難找到。
通過名稱, data['FirstName']
等訪問字段
使用csv
閱讀器可以產生二維數組的字符串:
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')
我認為您可能會遇到的一個問題是,您嘗試解析的數據並非全部為數字,這可能會導致意外行為。
檢測類型的一種方法是在將類型添加到數組之前嘗試識別它們。 例如:
for obj in my_data:
if type(obj) == int:
# process or add your data to numpy
else:
# cast or discard the data
聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.