2017-04-17 11 views
0

Ich habe einen CSV-Datensatz, der wie folgt aussieht:Importieren von CSV in 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 

Ich versuche zu laden Sie es in Python 3.6 mit diesem Code:

>>> from numpy import genfromtxt 

>>> my_data = genfromtxt('first.csv', delimiter=',') 
>>> print(train_data) 

Ausgang:

[[    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]] 

Ich habe mir die Numpy Docs angeschaut und ich sehe nichts darüber.

+0

Ist 'USA' oder' UK' eine Zahl?! Was ist das Problem, vor dem du stehst? –

+2

Das Problem, in das Sie möglicherweise geraten, ist das numpy, das Ihre Daten als numerischen Typ analysieren soll, und das könnte unerwartetes Verhalten verursachen. – AgnosticDev

+0

Die numerischen Spalten/Zeilen sind richtig, nur im Float. Die "Nan" stehen für Strings, die nicht als Floats interpretiert werden können. – hpaulj

Antwort

-1

Ich denke, das Problem, das Sie in die Daten ausgeführt werden könnte, ist, dass Sie nicht alle Numerik zu analysieren versuchen, und dies könnte möglicherweise verursacht unerwartetes Verhalten.

Eine Möglichkeit zum Erkennen der Typen besteht darin, die Typen zu identifizieren, bevor sie zu Ihrem Array hinzugefügt werden. Zum Beispiel:

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

Ohne jemand (auf unfaire Weise) angreifen zu wollen: diese Antwort hat eine sehr sehr niedrige Qualität, meistens * zeigt * die Quelle des Problems an, gibt keine Heilung und präsentiert Pseudocode, der weit vom Laufen entfernt ist (das ist für mich am meisten ärgerlich). Ich verstehe nicht, wie ich dies annehmen soll, besonders 30 Minuten nach der Frage. – sascha

+0

Sascha, Sie haben Recht, indem ich auf das Problem hinweise und keine definierte Lösung vorschlage. Wenn es im Interesse dieses Beitrags wäre, kann ich meine Antwort entfernen. – AgnosticDev

+0

Nun ... nicht meine Entscheidung. Aber die erste Aussage ist falsch (obwohl das die Spezialität von numpy ist), da numpy auch Strings speichern kann, sogar nur für einige Spalten in diesen Record-Arrays. Und der Pseudo-Code ist sehr schlecht und es ist nicht wirklich schwierig, deine Idee in Code auszudrücken (wahrscheinlich mit * isinstance *). – sascha

2

Gehen Sie mit pandas, wird es Ihnen die Mühe sparen:

import pandas as pd 

df = pd.read_csv('first.csv') 
print(df) 
1

Alternative pandas verwenden, ist csv Bibliothek

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

Ich bekomme eine Reihe von String dtype mit Ihrem Weg. – hpaulj

+0

Ah, ja. Sie müssen jedes zu anderen Typen später werfen, wenn Sie 'csv.reader' verwenden – titipata

1

Sie könnten nutzen die dtype Argument verwenden:

import numpy as np 

output = np.genfromtxt("main.csv", delimiter=',', skip_header=1, dtype='f, f, |S6, |S6, f, |S6') 

print(output) 

Ausgang:

[(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

Ich bin zu faul, um zu überprüfen, aber ich dachte über '' 'skip_header''', da die erste Reihe so schlecht aussah. In diesem Fall sollte die automatische Inferenz auch verwendet werden (keine Notwendigkeit, sie manuell zu definieren). Aber schließlich eine gute Antwort (die wirklich die Frage beantwortet). – sascha

+1

Ich denke, numpy würde daraus schließen, aber es tut es nicht, es setzt es wie Nan. – eyllanesc

+0

Wenn Sie die Typen ableiten möchten, können Sie 'Pandas' verwenden, wie in einer anderen Antwort gezeigt. – eyllanesc

1

Mit einem paar allgemeinen paramters genfromtxt diese Datei (in PY3 hier) lesen:

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

Dies ist ein strukturiertes Array. 2 Felder sind Integer, 2 sind String (standardmäßig Byte-String), ein anderer Integer und String.

Der Standard genfromtxt liest alle Zeilen als Daten. Ich benutze names=True, um die erste Zeile ein Feldnamen zu verwenden.

Es versucht auch, alle Zeichenfolgen ein Float (Standard dtype) zu lesen. Die Stringspalten werden dann als nan geladen.

All dies ist in der genfromtxt docs. Zugegeben, sie sind lang, aber sie sind nicht schwer zu finden.

Zugang Felder mit Namen, data['FirstName'] usw.


Mit dem csv Leser gibt einen 2D-Array von Strings:

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')