2016-07-12 3 views
2

Sagen wir, ich habe den folgenden dask Datenrahmen.Wie kann ich Daten aus einem DASK-Datenframe anhand einer Liste von Indizes auswählen?

dict_ = {'A':[1,2,3,4,5,6,7], 'B':[2,3,4,5,6,7,8], 'index':['x1', 'a2', 'x3', 'c4', 'x5', 'y6', 'x7']} 
pdf = pd.DataFrame(dict_) 
pdf = pdf.set_index('index') 
ddf = dask.dataframe.from_pandas(pdf, npartitions = 2) 

Darüber hinaus habe ich eine Liste von Indizes, die mich interessieren, z.

indices_i_want_to_select = ['x1','x3', 'y6'] 

Wie kann ich einen neuen dask Datenframe erzeugen, der nur die von den Indizes angegebenen Zeilen enthält? Gibt es einen Grund, warum etwas wie ddf [ddf.A> = 4] möglich ist, während ddf [ddf.index in indices_i_want_to_select] oder ddf.loc [indices_i_want_to_select] nicht ist?

+0

'loc' auf Listen wird noch nicht unterstützt. Siehe https://github.com/dask/dask/issues/1298 – MRocklin

+0

Vielen Dank für diese Information. Ich bestehe nicht darauf, loc zu verwenden, nur irgendeine mögliche Weise, ein dask Dataframe zu erzeugen, das auf einer Liste der Indizes basiert, wäre nett. Momentan bin ich ein bisschen festgefahren. –

+0

Sie sollten etwas mit 'map_partitions' hacken können – MRocklin

Antwort

2

Die folgende scheint zu funktionieren:

import pandas as pd 
import dask.dataframe as dd 

#generate example dataframe 
pdf = pd.DataFrame(dict(A = [1,2,3,4,5], B = [6,7,8,9,0]), index=['i1', 'i2', 'i3', 4, 5]) 
ddf = dd.from_pandas(pdf, npartitions = 2) 

#list of indices I want to select 
l = ['i1', 4, 5] 

#generate new dask dataframe containing only the specified indices 
ddf_selected = ddf.map_partitions(lambda x: x[x.index.isin(l)], meta = ddf.dtypes) 

edit: dies nur geeignet, wenn die Reihenfolge des Ergebnisses ist nicht wichtig.

+0

Für mich gibt dieses Beispiel eine leere Serie zurück. Dies ist das gleiche Problem, das ich in meinem eigenen Code festgestellt habe. Fehle ich etwas? –

+1

Aha, der Unterschied besteht darin, die Methode auf den Index oder andere Spaltenwerte anzuwenden. Bei anderen Spaltenwerten verwenden Sie einfach: 'ddf_selected = ddf [ddf.B.isin (l)]' –

Verwandte Themen