2017-04-17 121 views
0

我有一個CSV數據集,看起來像這樣:導入CSV成Python

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

是'USA'或'UK'多少?!你面臨的問題是什麼? –

+2

您可能會遇到的問題是numpy想要將數據解析爲數字類型,這可能會導致意外的行爲。 – AgnosticDev

+0

數字列/行是正確的,只是浮動。 'nan'代表不能被解釋爲浮動的字符串。 – hpaulj

回答

-1

我認爲,你可以運行到一個問題是,你正在試圖解析數據並不是所有的數字和這可能導致意外的行爲。

檢測類型的一種方法是在添加到數組之前嘗試並確定類型。例如:

for obj in my_data: 
    if type(obj) == int: 
     # process or add your data to numpy 
    else: 
     # cast or discard the data 
+0

不想攻擊某人(以某種不公平的方式):這個答案的質量非常低,主要是*表示*問題的根源,不能解決問題,並且提供遠離運行的僞代碼(這對我來說是最令人不安的)。我不明白如何接受這個問題,特別是在提問後30分鐘。 – sascha

+0

Sascha,你是正確的,我指出了問題,並沒有提供一個明確的解決方案。如果這對我來說是最有利的,我可以刪除我的答案。 – AgnosticDev

+0

呃...不是我的決定。但第一種說法是錯誤的(儘管這是numpy的專長),因爲numpy也可以存儲字符串,即使這些記錄陣列中的某些列也是如此。僞代碼非常糟糕,將代碼表達爲代碼並不難(可能使用* isinstance *)。 – sascha

2

圍棋與pandas,這將節省你的麻煩:

import pandas as pd 

df = pd.read_csv('first.csv') 
print(df) 
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) 
+0

我用你的方式得到一個字符串dtype數組。 – hpaulj

+0

啊,是的。如果使用'csv.reader',你必須在以後將其他類型轉換爲其他類型。 – titipata

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')] 
+0

我懶惰地檢查,但是我認爲''skip_header'''因爲第一行看起來很糟糕。在這種情況下,使用它,自動推理也可以工作(不需要手動定義它)。但最後一個很好的答案(這真的回答了這個問題)。 – sascha

+1

我認爲numpy會推斷它,但它不會,它會像nan一樣。 – eyllanesc

+0

如果你想推斷你可以使用'pandas'的類型,如另一個答案中所示。 – eyllanesc

1

少數一般paramters 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')