2016-11-22 1 views
3

In Pandas, wenn ich eine Spalte von bedingten Dummies erstellen möchte (sagen wir 1 wenn eine Variable gleich einer Zeichenkette ist und 0 wenn nicht), dann ist mein Goto in Pandas :Dask + Pandas: Eine Folge von bedingten Dummies zurückgeben

data["ebt_dummy"] = np.where((data["paymenttypeid"]=='ebt'), 1, 0) 

Naiv versuchen, dies in einem dask Datenframe wirft einen Fehler. Im Anschluss an die Anweisungen in der Dokumentation für map_partitions wirft auch einen Fehler:

data = data.map_partitions(lambda df: df.assign(ebt_dummy = np.where((df["paymenttypeid"]=='ebt'), 1, 0)), meta={'paymenttypeid': 'str', 'ebt_dummy': 'i8'}) 

Was eine gute Möglichkeit ist, oder die meist Dask-thonic Art und Weise, dies zu tun?

Antwort

1

Hier einige Beispieldaten spielen:

In [1]: 
df = pd.DataFrame(np.transpose([np.random.choice(['ebt','other'], (10)), 
       np.random.rand(10)]), columns=['paymenttypeid','other']) 

df 

Out[1]: 

    paymenttypeid     other 
0   other 0.3130770966143612 
1   other 0.5167434068096931 
2   ebt 0.7606898392115471 
3   ebt 0.9424572692382547 
4   ebt  0.624282017575857 
5   ebt 0.8584841824784487 
6   other 0.5017083765654611 
7   other 0.025994123211164233 
8   ebt 0.07045354449612984 
9   ebt 0.11976351556850084 

Lassen Sie uns dies

In [2]: data = dd.from_pandas(df, npartitions=2) 

zu einem Datenrahmen konvertieren und apply verwenden (auf einer Serie) zuzuordnen:

In [3]: 
data['ebt_dummy'] = data.paymenttypeid.apply(lambda x: 1 if x =='ebt' else 0, meta=('paymenttypeid', 'str')) 
data.compute() 

Out [3]: 
    paymenttypeid     other ebt_dummy 
0   other 0.3130770966143612   0 
1   other 0.5167434068096931   0 
2   ebt 0.7606898392115471   1 
3   ebt 0.9424572692382547   1 
4   ebt  0.624282017575857   1 
5   ebt 0.8584841824784487   1 
6   other 0.5017083765654611   0 
7   other 0.025994123211164233   0 
8   ebt 0.07045354449612984   1 
9   ebt 0.11976351556850084   1 

Update:

Es scheint, dass die meta Sie passieren das Problem ist, da dies funktioniert:

data = data.map_partitions(lambda df: df.assign(
            ebt_dummy = np.where((df["paymenttypeid"]=='ebt'), 1, 0))) 

data.compute() 

In meinem Beispiel, wenn ich die meta, angeben wollte würde ich die dtypes von passieren müssen die aktuelle data, nicht die, die ich einmal erwarte ich zuweisen:

data.map_partitions(lambda df: df.assign(
            ebt_dummy = np.where((df["paymenttypeid"]=='ebt'), 1, 0)), 
       meta={'paymenttypeid': 'str', 'other': 'float64'}) 
+0

Danke für die Antwort! Gibt es einen vektorisierten Weg, dies zu tun? Ich hatte darüber nachgedacht, aber eine Zeile für Zeile auf etwas anderes als einen kleinen Datensatz anwenden ist ziemlich prohibitiv. – sfortney

+1

Ich aktualisierte meine Antwort, um es mit 'map_partitions' zu tun (nie verwendet Dask bis jetzt ...). Ich schlage vor, Sie überarbeiten Ihr Meta-Keyword. Das obige funktioniert gut. –

+0

Ja, was es war. Ich habe das Meta falsch verstanden. Danke für die Hilfe! – sfortney

0

das ist für mich auch gearbeitet:

data['ebt_dummy'] = dd.from_array(np.where((df["paymenttypeid"]=='ebt'), 1, 0))