2017-05-16 4 views
1

Ich habe einen Pandas Datenrahmen, den ich in mehrere kleinere Stücke von jeweils 100k Zeilen aufteilen möchte, dann auf der Festplatte speichern, so dass ich die Daten einlesen und einzeln verarbeiten kann. Ich habe versucht, mit dill und hdf Speicher, wie CSV und Rohtext scheint eine Menge Zeit zu nehmen.Effizientes Lesen und Schreiben von Pandas Datenrahmen

Ich versuche dies auf einer Teilmenge von Daten mit ~ 500k Zeilen und fünf Spalten mit gemischten Daten. Zwei enthält Strings, ein Integer, ein Float und der letzte enthält Bigramm-Zählungen von sklearn.feature_extraction.text.CountVectorizer, gespeichert als scipy.sparse.csr.csr_matrix Sparse-Matrix.

Es ist die letzte Spalte, mit der ich Probleme habe. Dumping und das Laden der Daten geht ohne Problem, aber wenn ich versuche, tatsächlich auf die Daten zuzugreifen, ist es stattdessen ein Pandas.Series-Objekt. Zweitens ist jede Zeile in dieser Reihe ein Tupel, das stattdessen den gesamten Datensatz enthält.

# Before dumping, the original df has 100k rows. 
# Each column has one value except for 'counts' which has 1400. 
# Meaning that df['counts'] give me a sparse matrix that is 100k x 1400. 

vectorizer = sklearn.feature_extraction.text.CountVectorizer(analyzer='char', ngram_range=(2,2)) 
counts = vectorizer.fit_transform(df['string_data']) 
df['counts'] = counts 

df_split = pandas.DataFrame(np.column_stack([df['string1'][0:100000], 
               df['string2'][0:100000], 
               df['float'][0:100000], 
               df['integer'][0:100000], 
               df['counts'][0:100000]]), 
               columns=['string1','string2','float','integer','counts']) 
dill.dump(df, open(file[i], 'w')) 

df = dill.load(file[i]) 
print(type(df['counts']) 
> <class 'pandas.core.series.Series'> 
print(np.shape(df['counts']) 
> (100000,) 
print(np.shape(df['counts'][0]) 
> (496718, 1400) # 496718 is the number of rows in my complete data set. 
print(type(df['counts'])) 
> <type 'tuple'> 

mache ich einen offensichtlichen Fehler, oder gibt es einen besseren Weg, um diese Daten in diesem Format zu speichern, eine, die raubend nicht sehr zeit? Es muss auf meine vollständigen Daten mit 100 Millionen Zeilen skalierbar sein.

+0

Wie haben Sie erstellen/anhängen die Spalte zählt? – MaxU

+0

Ich habe dies dem Code – Tobias

+1

hinzugefügt Ich denke nicht, dass es eine gute Idee ist, eine spärliche Matrix als Pandasäule zu speichern - IMO, es ist ein fehleranfälliger Weg. Ich würde sie getrennt speichern ... – MaxU

Antwort

1
df['counts'] = counts 

dies eine Pandas Series (Spalte) mit der Anzahl der Elemente gleich len(df) erzeugen und wo jedes Element ist eine spärliche Matrix, die durch vectorizer.fit_transform(df['string_data'])

zurückgekehrt ist, können Sie versuchen, das zu tun folgende:

df = df.join(pd.DataFrame(counts.A, columns=vectorizer.get_feature_names(), index=df.index) 

HINWEIS: bewusst sein, das Ihre sparse Matrix in verdichteter (nicht spärlich) Datenrahmen explodieren wird, so wird es verwenden viel mehr Speicher und Sie können mit dem MemoryError

Schlussfolgerung am Ende: Deshalb habe ich Ihnen empfehlen würde Ihre ursprüngliche DF und count Sparse Matrix zu speichern separat

+0

Danke, in der Tat die Größe explodiert. Ich werde die beiden trennen, wie Sie vorgeschlagen haben. – Tobias

+0

@Tobias, froh, dass es geholfen hat :) – MaxU

Verwandte Themen