2016-07-28 11 views
3

Ich habe dieses Problem seit ein paar Tagen und versuchte ein paar verschiedene Ansätze, aber ich kann nicht scheinen, es richtig zu machen. Dies ist die eine vereinfachte Version meiner CSV-Datei: testme.csvVersuchen, Teil von CSV zu numpy Array zu extrahieren

"Name", "City", "State", "1996-04", "1996-05", "1996-06", "1996-07" 
    "Bob", "Portland", "OR", 100000, 120000, 140000, 160000 
    "Sally", "Eugene", "OR", 50000, 75000, 80000, 90000 
    "Peter", "San Francisco", "CA", , , 440000, 500000 

ich die Zahlen als 2D-Array zu extrahieren, die ich möchte auf einige Mathematik zu tun. Allerdings habe ich diese Textfelder davor, die ich ignorieren muss. Außerdem haben einige Zeilen keine Zahlen für alle Spalten, aber sobald die Zahlen beginnen, sind sie kontinuierlich nach rechts (d. H. Einige Zeilen haben leere Elemente für die ersten mehreren Spalten), und dies kann für jede Zeile unterschiedlich sein. Darüber hinaus ist dies die eigentliche Datensatz Hunderte von Zeilen und Dutzende von Spalten

hat einige von dem, was ich versucht habe:

import csv 
    import numpy as np 

    filename = "testme.csv" 

    ifile = open(filename, 'r') 
    header1 = ifile.readline() 

    reader = csv.reader(ifile) 
    A = np.array([]).reshape(0, 4) 

    for row in reader: 
     print row 
     print row[3:] 
     A = np.vstack([A, row[3:]]) 

    print A 

Und dann bekomme ich diese:

['Bob', ' "Portland"', ' "OR"', ' 100000', ' 120000', ' 140000', ' 160000'] 
    [' 100000', ' 120000', ' 140000', ' 160000'] 
    ['Sally', ' "Eugene"', ' "OR"', ' 50000', ' 75000', ' 80000', ' 90000'] 
    [' 50000', ' 75000', ' 80000', ' 90000'] 
    ['Peter', ' "San Francisco"', ' "CA"', ' ', ' ', ' 440000', ' 500000'] 
    [' ', ' ', ' 440000', ' 500000'] 
    [[' 100000' ' 120000' ' 140000' ' 160000'] 
    [' 50000' ' 75000' ' 80000' ' 90000'] 
    [' ' ' ' ' 440000' ' 500000']] 

I‘ m nah, aber die Elemente sind jetzt alle wörtliche Zeichenfolgen. Gibt es einen einfacheren Weg dies zu tun und stattdessen Zahlen zu bekommen oder kann ich das durchgehen und jedes Element in Zahlen umwandeln? Und die leeren Elemente könnte ich davon profitieren, sie auf Null zu klemmen.

Vielen Dank für Rat und Hilfe im Voraus!

Aaron

Update (8/1/16) ich mit der genfromtxt Methode ging als das angepasst, was ich viel benötigt. Hier ist das Ergebnis für die Nachwelt und anderen

import csv 
    import numpy as np 

    NumIgnoreFirstCols = 3 
    filename = "testme2.csv" 

    ifile = open(filename, 'r') 
    reader = csv.reader(ifile) 
    header1 = next(reader) 
    numcols = len(header1) 
    #Find number of cols for usecol in genfromtxt 
    print("numcols", numcols) 
    ifile.close() 

    print(range(NumIgnoreFirstCols, numcols)) 

    aMatrix = np.genfromtxt(filename, skip_header=1, delimiter=',', usecols=range(NumIgnoreFirstCols,numcols), dtype=int) 

    print aMatrix 

    normalizedMatrix = np.where(aMatrix<0, 0, aMatrix) 
    print(normalizedMatrix) 

    minValue = np.amin(normalizedMatrix) 
    maxValue = np.amax(normalizedMatrix) 
    print (minValue, maxValue) 

Nochmals vielen Dank für all die Hilfe

Antwort

2

Mit Ihrer Probe numpygenfromtxt Werke:

In [166]: np.genfromtxt('stack38627130.csv',names=True,delimiter=',',dtype=None) 

Out[166]: 
array([(b'"Bob"', b' "Portland"', b' "OR"', 100000, 120000, 140000, 160000), 
     (b'"Sally"', b' "Eugene"', b' "OR"', 50000, 75000, 80000, 90000), 
     (b'"Peter"', b' "San Francisco"', b' "CA"', -1, -1, 440000, 500000)], 
     dtype=[('Name', 'S7'), ('City', 'S16'), ('State', 'S5'), ('199604', '<i4'), ('199605', '<i4'), ('199606', '<i4'), ('199607', '<i4')]) 

Dies ist eine 1d strukturierte Anordnung; Sie Zugriff auf Spalten von Feldnamen (hier aus Ihrer Kopfzeile abgeleitet)

In [167]: data=_ 
In [168]: data['199604'] 
Out[168]: array([100000, 50000,  -1]) 
In [169]: data['199607'] 
Out[169]: array([160000, 90000, 500000]) 

Die fehlenden Felder mit -1 gefüllt sind. Ich denke, das kann sich ändern.

Es gibt andere Parameter für die Einstellung von Feldnamen, wenn Sie die abgeleiteten nicht mögen.

Lesen kann auf die numerischen Spalten beschränkt werden; unterschiedliche Füllung abhängig von der dtype.

In [171]: np.genfromtxt('stack38627130.csv',skip_header=1,delimiter=',',usecols= 
    ...: [3,4,5,6]) 
Out[171]: 
array([[ 100000., 120000., 140000., 160000.], 
     [ 50000., 75000., 80000., 90000.], 
     [  nan,  nan, 440000., 500000.]]) 
In [172]: np.genfromtxt('stack38627130.csv',skip_header=1,delimiter=',',usecols= 
    ...: [3,4,5,6],dtype=int) 
Out[172]: 
array([[100000, 120000, 140000, 160000], 
     [ 50000, 75000, 80000, 90000], 
     [ -1,  -1, 440000, 500000]]) 

Jetzt erhalten wir ein 2d-Array.

Ich glaube, pandas behandelt fehlende Felder besser, aber solange diese Felder mit dem Trennzeichen markiert sind, sollte genfromtxt keine Probleme haben.

genfromtxt grob tut:

result = [] 
for row in reader: 
    data = row[3:] 
    data = [float(x) for x in data] 
    result.append(data) 
result = np.array(result) 

np.array können die Schwimmer Konvertierung tun, wenn alle Saiten konvertieren richtig; es behandelt nicht die leeren oder nan. Im Allgemeinen ist das Sammeln einer Werteliste besser als wiederholt vstack (oder verkettet).

+0

Ich ging mit dieser Lösung, da sie das meiste von dem entsprach, was ich brauchte. Ich poste auch, was ich zuletzt benutzt habe –

1

Wenn - und das ist ein großes, wenn (I kid) - Sie pandas verwenden können:

from StringIO import StringIO 
s = StringIO(''' "Name", "City", "State", "1996-04", "1996-05", "1996-06", "1996-07" 
        "Bob", "Portland", "OR", 100000, 120000, 140000, 160000 
        "Peter", "San Francisco", "CA", , , 440000, 500000 ''') 
df = pd.read_csv(s,skipinitialspace=True) 

Anfahrt ...

 
>>> df 
    Name   City State 1996-04 1996-05 1996-06 1996-07 
0 Bob  Portland OR 100000.0 120000.0 140000 160000 
1 Peter San Francisco CA  NaN  NaN 440000 500000 

Clamp auf Null, wie Sie sagen:

df = df.fillna(0) 

Ich denke, das ist das Endergebnis Sie wollten:

 
>>> df 
    Name   City State 1996-04 1996-05 1996-06 1996-07 
0 Bob  Portland OR 100000.0 120000.0 140000 160000 
1 Peter San Francisco CA  0.0  0.0 440000 500000 
+0

Das richtige Werkzeug für den richtigen Job. Numpy ist großartig, aber es behandelt nicht heterogene (verschiedene) Datentypen. – Mephy

+1

'numpy' kann heterogene Datentypen verarbeiten - mit strukturierten Arrays. Die Leute benutzen 'genfromtxt' dafür die ganze Zeit. Viele Fragen dazu. – hpaulj

Verwandte Themen