2017-07-07 4 views
1

Es ist ein bisschen kompliziert zu erklären, also werde ich mein Bestes tun. Ich habe einen Pandas mit zwei Spalten: Stunde (von 1 bis 24) und Wert (entsprechend jeder Stunde). Der Dataset-Index ist riesig, aber die Spaltenstunde wird auf dieser 24-Stunden-Basis wiederholt (von 1 bis 24). Ich versuche, neue 24 Spalten zu erstellen: Wert -1, Wert -2, Wert -3 ... Wert -24, die jeder Zeile entsprechen und Wert von -1 Stunde, Wert von -2 Stunden (von oben Zeilen).Pandas, erstellen neue Spalten basierend auf bestehenden mit wiederholter Zählung

hour | value | value -1 | value -2 | value -3| ... | value - 24 
1  10  0   0   0    0 
2  11  10   0   0    0 
3  12  11   10   0    0 
4  13  12   11   10    0 
... 
24  32  31   30   29    0 
1  33  32   31   30    10 
2  34  33   32   31    11 
and so on... 

Alle Wertnummern sind für das Beispiel. Wie gesagt es gibt viele Zeilen, nicht nur 24 für alle Stunden an einem Tag sondern alle folgenden Zeitreihen von 1 bis 24 usw. Vielen Dank im Voraus und möge die Macht mit dir sein!

+0

Darf ich fragen, warum Sie das tun möchten? Sie führen viele redundante Daten ein, also gibt es wahrscheinlich einen besseren Weg. – Denziloe

+0

Es ist wahrscheinlich besser, die Logik nicht in die Datenbank zu schreiben, sondern in eine unabhängige Funktion. Du solltest es wahrscheinlich überdenken. – baloo

Antwort

2

Ist das, was Sie brauchen?

df = pd.DataFrame([[1,10],[2,11], 
      [3,12],[4,13]], columns=['hour','value']) 

for i in range(1, 24): 
    df['value -' + str(i)] = df['value'].shift(i).fillna(0) 

Ergebnis:

enter image description here

0

Ist das, was Sie suchen?

import pandas as pd 
df = pd.DataFrame({'hour': list(range(24))*2, 
        'value': list(range(48))}) 

shift_cols_n = 10 
for shift in range(1, shift_cols_n): 
    new_columns_name = 'value - ' + str(shift) 

    # Assuming that you don't have any NAs in your dataframe 
    df[new_columns_name] = df['value'].shift(shift).fillna(0) 

    # A safer (and a less simple) way, in case you have NAs in your dataframe 
    df[new_columns_name] = df['value'].shift(shift) 
    df.loc[:shift, new_columns_name] = 0 

print(df.head(9)) 

    hour value value - 1 value - 2 value - 3 value - 4 value - 5 \ 
0  0  0  0.0  0.0  0.0  0.0  0.0 
1  1  1  0.0  0.0  0.0  0.0  0.0 
2  2  2  1.0  0.0  0.0  0.0  0.0 
3  3  3  2.0  1.0  0.0  0.0  0.0 
4  4  4  3.0  2.0  1.0  0.0  0.0 
5  5  5  4.0  3.0  2.0  1.0  0.0 
6  6  6  5.0  4.0  3.0  2.0  1.0 
7  7  7  6.0  5.0  4.0  3.0  2.0 
8  8  8  7.0  6.0  5.0  4.0  3.0 

    value - 6 value - 7 value - 8 value - 9 
0  0.0  0.0  0.0  0.0 
1  0.0  0.0  0.0  0.0 
2  0.0  0.0  0.0  0.0 
3  0.0  0.0  0.0  0.0 
4  0.0  0.0  0.0  0.0 
5  0.0  0.0  0.0  0.0 
6  0.0  0.0  0.0  0.0 
7  1.0  0.0  0.0  0.0 
8  2.0  1.0  0.0  0.0 
Verwandte Themen