2016-08-04 7 views
1

Ich habe eine große Textdatei, in die Spalten der folgenden Form sind:Fragen zu read_csv und str dtype

1255 32627 some random stuff which might have numbers 1245 

1.Ich read_csv nutzen möchte mich mit drei Spalten einen Datenrahmen zu geben. Die ersten beiden Spalten sollten dtype uint32 sein, und die dritte Spalte enthält einfach alles in einer Zeichenfolge. Die obige Zeile sollte in 1255, 32627 und some random stuff which might have numbers 1245 aufgeteilt werden. Dies zum Beispiel tut es nicht, aber zumindest zeigt die dtypes:

pd.read_csv("foo.txt", sep=' ', header=None, dtype={0:np.uint32, 1:np.uint32, 2:np.str}) 

2.My zweite Frage bezieht sich auf die str dtype.How viel RAM sie nicht verwendet und wenn ich die maximale Länge eines Strings wissen kann ich das reduzieren?

Antwort

1
  1. Gibt es einen Grund, warum Sie pd.read_csv() verwenden müssen? Der folgende Code ist unkompliziert und passt Ihre Spaltenwerte einfach an Ihre Anforderungen an.

    from numpy import uint32 
    from csv import reader 
    from pandas import DataFrame 
    
    file = 'path/to/file.csv' 
    with open(file, 'r') as f: 
        r = reader(f) 
        for row in r: 
         column_1 = uint32(row[0]) 
         column_2 = uint32(row[1]) 
         column_3 = ' '.join([str(col) for col in row[2::]]) 
    
        data = [column_1, column_2, column_3] 
        frame = DataFrame(data) 
    
  2. Ich verstehe die Frage nicht. Erwarten Sie, dass Ihre Saiten extrem lang sind? Eine 32-Bit-Python-Installation ist auf eine 2-3GB lange Zeichenfolge beschränkt. Eine 64-Bit-Installation ist viel größer, nur durch die Menge an RAM begrenzt, die Sie in Ihr System stopfen können.

+0

Danke. Es tut mir leid, ich meine, dass die Zeichenfolgen sehr kurz sein können (z. B. 2 Zeichen) und ein Objekt viele Bytes verwendet. – eleanora

1

Sie können die Series.str.cat Methode verwenden, Dokumentation, für die zur Verfügung here:

df = pd.read_csv("foo.txt", sep=' ', header=None) 

# Create a new column which concatenates all columns 
df['new'] = df.apply(lambda row: row.iloc[2:].apply(str).str.cat(sep = ' '),axis=1) 
df = df[[0,1,'new']] 

Nicht sicher genau das, was Sie von Ihrer zweiten Frage bedeuten, aber wenn Sie die Größe einer Zeichenfolge überprüfen im Speicher Sie

import sys 
print (sys.getsizeof('some string')) 

Leider können, habe ich keine Ahnung, wie die maximale Länge zu wissen, werden Sie Speicher zu sparen helfen und ob das überhaupt möglich

+0

Bitte korrigieren Sie 'sep = '''. –

+0

Vielen Dank !! –

+0

Dies liest alle Spalten separat und führt sie dann zusammen. Ich hatte gehofft, dass du das vermeiden kannst. – eleanora