2017-01-13 7 views
0

Ich habe ein Datenframe (df) mit 2 Spalten und 1 Index.Verschieben von Elementen der Spalte basierend auf Index gegeben Bedingung auf einer anderen Spalte

Index ist Datetime Index und ist im Format von 2001-01-30 .... etc und der Index ist nach DATE sortiert und es gibt Tausende von identischen Daten (und ist Monatsdaten). Spalte A ist der Firmenname (entspricht dem Datum), Spalte B sind Aktienkurse für die Firmennamen in der Spalte A für das Datum im Index.

Jetzt gibt es mehrere Unternehmen in Spalte A für jedes Datum, und Unternehmen variieren im Laufe der Zeit (so dass die Daten nicht vollständig vorhersehbar sind).

Ich möchte eine Spalte C erstellen, die alle Preise, die in B sind, auf das nächste Datum voreilt (wie im Index).

Eine grundlegende .shift() würde nicht funktionieren, da ich alle Preise verschieben würde basierend auf der Bedingung, dass das Unternehmen immer noch dort am nächsten Punkt im Index ist.

ich eine Spalte C wollen, die durch 1 B nach vorne verschiebt, und eine Spalte D, die es durch verschiebt zurück 1.

Ich habe auf diese für eine Weile aufgeklebt, jemand sehr klug bitte helfen. nicht

Dank

+2

Als Neben e, 31. Februar existiert nur auf Pegasus 51. – Boud

+0

Notiert, und formulierte die Fragen neu. Danke – MysterioProgrammer91

Antwort

1

Betrachten Sie das Beispiel Datenrahmen df unter

np.random.seed([3,1415]) 
df = pd.concat(dict(
     A=pd.Series(np.random.rand(10), pd.date_range('2016-09-30', periods=10)), 
     B=pd.Series(np.random.rand(7), pd.date_range('2016-09-25', periods=7)), 
     C=pd.Series(np.random.rand(10), pd.date_range('2016-09-20', periods=10)), 
     D=pd.Series(np.random.rand(8), pd.date_range('2016-10-30', periods=8)), 
     E=pd.Series(np.random.rand(12), pd.date_range('2016-10-25', periods=12)), 
     F=pd.Series(np.random.rand(14), pd.date_range('2016-08-30', periods=14)), 

    )).rename_axis(['ColumnA', None]).reset_index('ColumnA', name='ColumnB') 

print(df.head(10)) 

      ColumnA ColumnB 
2016-09-30  A 0.444939 
2016-10-01  A 0.407554 
2016-10-02  A 0.460148 
2016-10-03  A 0.465239 
2016-10-04  A 0.462691 
2016-10-05  A 0.016545 
2016-10-06  A 0.850445 
2016-10-07  A 0.817744 
2016-10-08  A 0.777962 
2016-10-09  A 0.757983 

Verwendung groupby + shift

d1 = df.set_index('ColumnA', append=True) 
g = d1.groupby(level='ColumnA').ColumnB 
keys = ['Forward', 'Back'] 
new_df = d1.join(pd.concat([g.shift(i) for i in [-1, 1]], axis=1, keys=keys)) 
print(new_df.query('ColumnA == "A"').head(10)) 

        ColumnB Forward  Back 
      ColumnA        
2016-09-30 A  0.444939 0.407554  NaN 
2016-10-01 A  0.407554 0.460148 0.444939 
2016-10-02 A  0.460148 0.465239 0.407554 
2016-10-03 A  0.465239 0.462691 0.460148 
2016-10-04 A  0.462691 0.016545 0.465239 
2016-10-05 A  0.016545 0.850445 0.462691 
2016-10-06 A  0.850445 0.817744 0.016545 
2016-10-07 A  0.817744 0.777962 0.850445 
2016-10-08 A  0.777962 0.757983 0.817744 
2016-10-09 A  0.757983  NaN 0.777962 
+1

Wer auch immer unten diese Antwort wählte: Ich würde Rückgespräch schätzen, also kann ich entweder die Antwort verbessern oder es löschen. – piRSquared

+0

IMO gibt es absolut keinen Grund für die Ablehnung dieser Antwort! – MaxU

+0

Danke, ich versuche Ihr Beispiel, aber für den ersten Teil kann ich nicht den Datenrahmen erstellen, da es sagt, dass "Liste" -Objekt nicht aufrufbar ist, "was ich versuche, die rename_axis." Zusätzlich noch eine Sache, aktuell sind meine Daten im Format Alle Daten zusammen mit dem entsprechenden Firmennamen in Spalte A, zB für die ersten 200 Einträge des Datenrahmens ist das Datum bei verschiedenen Firmen gleich, jede Idee ist zu ändern mein Format zu deinem Format? Nochmals vielen Dank für Ihre Antwort und ich freue mich von Ihnen zu hören piRSquared – MysterioProgrammer91

Verwandte Themen