2017-08-20 3 views
0
Date   Sin  Ret 
01/01/1990 True 0.03 
01/02/1990 True 0.02 
01/01/1990 False 0.01 
01/02/1990 False 0.05 

Ich möchteumformen eine Spalte basierend auf einer anderen Spalte in einem Pandas Datenrahmen

Date   Ret1 Ret2 
01/01/1990 0.03 0.01 
01/02/1990 0.02 0.05 

so dass ich

Date   Ret1-Ret2 
01/01/1990 0.02 
01/02/1990 -0.03 

bekommen Was ist der beste Weg, dies zu tun? Ich dachte darüber nach, Datum und Sünde als Index festzulegen und die Sünde zu entstapeln. Gibt es einen leichteren Weg?

Antwort

1

Index I think Einstellung und Stapeln ist eine gute Idee, aber hier ist eine Alternative mit Dreh:

(df.pivot(index='Date', columns='Sin', values='Ret') 
    .rename(columns={True: 'Ret1', False: 'Ret2'})) 

Sin   Ret1 Ret2 
Date     
01/01/1990 0.03 0.01 
01/02/1990 0.02 0.05 
+0

Können Sie mir ein kurzes Beispiel geben, in dem man eindeutig besser ist als das andere? Ich hatte nie einen Anwendungsfall, in dem ich Pivot verwenden wollte (was nicht durch Stacks möglich ist), also weiß ich nicht wirklich, was es tut. – Lost1

+1

Um Ihre Ausgabe zu erhalten, könnten Sie tun: "df.pivot (index = 'Datum', Spalten = 'Sin', Werte = 'Ret'). T.Diff(). Iloc [-1]' –

+0

@ Lost1 To Ehrlich gesagt glaube ich nicht, dass es einen Unterschied gibt. Der Quellcode von [pivot] (https://github.com/pandas-dev/pandas/blob/master/pandas/core/reshape/reshape.py#L362) scheint darauf hinzudeuten, dass es unter der Haube als Indizierung/Entstapelung arbeitet Gut. – ayhan

3

Hier ist eine Lösung mit df.set_index und df.unstack:

In [516]: df.set_index(['Date', 'Sin']).unstack(0).diff().iloc[-1] 
Out[516]: 
    Date  
Ret 01/01/1990 0.02 
    01/02/1990 -0.03 
Name: True, dtype: float64 
+1

Schön und prägnant ~ – Wen

1

Meine Lösung Ziel nur die endgültige Ausgabe.

df.Sin=df.Sin.astype(int).replace({0:-1}) 
df.Ret=df.Sin.mul(df.Ret) 
df.groupby('Date')['Ret'].agg({'Ret1-Ret2':'sum'}) 
      Ret1-Ret2 
Date     
01/01/1990  0.02 
01/02/1990  -0.03 
+0

Nice thinking dude ... –

Verwandte Themen