2017-10-29 5 views
1

ich Pandas Datenrahmen haben, die einen Multiindex des Monats hat, dann Tag, und dann eine einzelne Spalte von Datenwerten, sieht in etwa wie folgt aus:Pandas Multiindex zu Monat-Tag-Format in einer einzigen Spalte

 Data 
1 1  6 
    2  10 
    3  11 
    4  12 
    5  50 
    ... 
12 1 3 
    2 4 
    3 10 
    4 11 

Sie bekommen den Punkt. Ich habe den Monat und das Datum gruppiert. Ich möchte eine neue Spalte erstellen, die das Monat-Datum zusammen formatiert. Aber ich kann es nicht herausfinden. Wunsch Ausgabe wird in etwa wie folgt aussehen:

M-D Data 
1-01 6 
1-02 10 
1-03 11 
1-04 14 
1-05 50 

Kann mir jemand eine optimale Lösung für diese anbieten? Hinweis: Ich habe den Index früher mit dem folgenden Code erstellt, vielleicht muss ich zurückgehen und einige Umstrukturierungen vornehmen? Ich habe dies zu einem Multiindex gemacht, damit ich die min() Werte finden kann. Die ursprünglichen Spalten "Monat" und "Tag" hatten Monate und Tage über einen Zeitraum von 10 Jahren und ich brauchte nur das Minimum dieser 10 Jahre, also die Gruppe von().

dframe['Date'] = pd.to_datetime(dframe['Date']) 
dframe['Month'], dframe['Day'] = dframe['Date'].dt.month, 
dframe['Date'].dt.day 
finaldf = dframe.groupby(['Month','Day'])['Data_Value'].min() 
df = pd.DataFrame(finaldf) 

Vielen Dank im Voraus!

Antwort

3

Wenn Sie Monat und Tag müssen als m-d formatiert werden, dann nicht zu trennen sie von Anfang an ist ein vernünftiger Ansatz, zum Beispiel, können Sie Datum Spalt als %m-%d Formatierung Gruppe durch diese Variable und Aggregationen tun Sie brauchen:

dframe.groupby(pd.to_datetime(dframe['Date']).dt.strftime('%m-%d'))['Data_Value'].min() 

Ein kurzes Beispiel:

dframe = pd.DataFrame({ 
    'Date': ['2017-08-01', '2016-08-01', '2017-08-02'], 
    'Data_Value': [2,3,4] 
}) 

dframe.groupby(pd.to_datetime(dframe['Date']).dt.strftime('%m-%d'))['Data_Value'].min() 

#Date 
#08-01 2 
#08-02 4 
#Name: Data_Value, dtype: int64 
+0

dies funktioniert genau so, wie verwenden würde ich es brauchte. Das ist das erste Mal, dass ich mit dieser großen Menge an Datetime-Daten arbeite, also danke. –

0

Es ist ein bisschen schwierig mit Multiindex zu arbeiten, ich bin nicht sicher, dass dies sehr zeitsparend ist, aber es funktioniert:

df["M-D"] = [str(df.index[i][0])+'-'+str(df.index[i][1]) for i in range(len(df))] 

Es ergibt folgendes Ergebnis:

In[143]: df.head() 
Out[143]: 
      Open New_date 
Month Day    
1  1 9597  1-1 
     2 9370  1-2 
     3 9365  1-3 
     4 9766  1-4 
     5 9446  1-5 
2

Ich würde Nimm @ Psidoms Ratschlag. Um jedoch die Frage zu lösen, die gestellt wurde:
I format

df.assign(**{'M-D': df.index.map('{0[0]}-{0[1]}'.format).rename('M-D')}) 

     Data M-D 
1 1  6 1-1 
    2 10 1-2 
    3 11 1-3 
    4 12 1-4 
    5 50 1-5 
12 1  3 12-1 
    2  4 12-2 
    3 10 12-3 
    4 11 12-4 

Setup-

df = pd.DataFrame(dict(
    Data=[6, 10, 11, 12, 50, 3, 4, 10, 11], 
), [[1] * 5 + [12] * 4, list(range(1, 6)) + list(range(1, 5))]) 
Verwandte Themen