2017-06-28 2 views
3

Gibt es eine Möglichkeit, die Werte einer Spalte in Pandas Datenrahmen einen Monat nach vorne zu verschieben? (Beachten Sie, dass ich den Spaltenwert und nicht den Datumswert eingeben möchte). Zum Beispiel, wenn ich habe:Verschieben der Werte einer Spalte in Pandas Datenrahmen einen Monat nach vorne

  ColumnA ColumnB 
2016-10-01  1 1 
2016-09-30  2 7 
2016-09-29  5 7 
2016-09-28  7 7 
. 
. 
2016-09-01  3 7 
2016-08-31  3 X 
2016-08-30  4 X 
2016-08-29  9 x 
2016-08-28  10 x 

Im Daten ich habe:

  ColumnA ColumnB 
2016-10-01  1 0 
2016-09-30  2 1 
2016-09-29  5 1 
2016-09-28  7 1 
. 
. 
2016-09-01  3 1 
2016-08-31  4 7 
2016-08-30  4 7 
2016-08-29  9 7 
2016-08-28  10 7 

Sie anschließend die gewünschte Ausgabe zu erhalten Ich möchte in der Lage, die Werte in columnB 1 Monat nach vorne zu verschieben, Der Wert wird für jeden Monat festgelegt (der Wert in ColumnB war beispielsweise im September 1). Daher sollte die Tatsache, dass die Anzahl der Tage jeden Monat ein wenig anders ist, kein Problem darstellen.

Dies scheint verwandt Python/Pandas - DataFrame Index - Move one month forward, aber in der verknüpften Frage wollte das OP den gesamten Rahmen verschieben, und ich möchte nur ausgewählte Spalten verschieben.

+0

Was wollen Sie passieren, wenn 31. August im Dataset waren? Sowohl Aug 31 als auch 30 würden bis zum 30. September abbilden. –

+0

@Ted Petrou siehe mein Kommentar zu dir in der Diskussion unten die Antwort von beniev. –

Antwort

2

Es ist nicht zu elegant ist, aber man kann so etwas tun:

df=df.reset_index() 
df['index']=pd.to_datetime(df['index'],infer_datetime_format=True) 
df['offset']=df['index']-pd.DateOffset(months=1) 
res=df.merge(df,right_on='index',left_on='offset',how='left') 

und nehmen Sie nur aus res den Spalten Sie

+0

Das würde nicht funktionieren, wenn es 31. August in den Daten gab. Sowohl 30. August als auch 31. August würden auf 30. September gemappt. –

+0

@Ted Petrou danke für Ihren Kommentar. Ich habe meine Frage aktualisiert, da die Daten, mit denen ich arbeite, möglicherweise komfortabler sind. –

+0

@Ted Petrou So kann man 'pd.to_timedelta (1, unit = 'M')' anstelle von 'pd.DateOffset (monates = 1)' –

1

Sie möchten für jeden einen neuen Index der Pandas Perioden zuerst erstellen Monat und dann finden Sie den Wert von jedem Monat und verwenden Pandas automatische Indexausrichtung, um eine neue Spalte zu erstellen.

df1 = df.copy() 
orig_idx = df.index 
df1.index = orig_idx.to_period('M') 
col_b_new = df1.groupby(level=0)['ColumnB'].first().tshift(1) 
df1['ColumnB_new'] = col_b_new 
df1.index = orig_idx 

Ausgabe

  ColumnA ColumnB ColumnB_new 
2016-10-01  1  0   1.0 
2016-09-30  2  1   7.0 
2016-09-29  5  1   7.0 
2016-09-28  7  1   7.0 
2016-09-01  3  1   7.0 
2016-08-31  4  7   NaN 
2016-08-30  4  7   NaN 
2016-08-29  9  7   NaN 
2016-08-28  10  7   NaN 
Verwandte Themen