Sortieren ein pandas dataframe ist Serie von Monats-Namen?
Habe ich eine Reihe Objekt:
date price
dec 12
may 15
apr 13
..
Anweisung Problem: ich es machen will, erscheinen nach Monat und berechnen Sie den Mittelwert der Preis pro Monat und präsentieren es mit einer geordneten Art und Weise nach Monat.
Gewünschte Ausgabe:
month mean_price
Jan XXX
Feb XXX
Mar XXX
Dachte ich, eine Liste und übergeben es in eine Art Funktion:
months = ["Jan", "Feb", "Mar", "Apr", "May", "Jun", "Jul", "Aug", "Sep", "Oct", "Nov", "Dec"]
aber die sort_values nicht unterstützt, die für die Serie.
Einem großen problem, das ich habe, ist, dass, obwohl
df = df.sort_values(by='date',ascending=True,inplace=True)
funktioniert
der erste df
aber nachdem ich Tat ein groupby
es nicht halten Sie die Reihenfolge aus den sortierten df
.
Zu dem Schluss, die ich brauchte, die anfänglichen Daten im Rahmen dieser beiden Spalten. Sortiert die datetime-Spalte ist und durch eine groupby mit dem Monat (dt.strftime('%B')) die Sortierung kam Durcheinander. Jetzt muss ich es Sortieren nach Monat name.
Mein code:
df # has 5 columns though I need the column 'date' and 'price'
df.sort_values(by='date',inplace=True) #at this part it is sorted according to date, great
total=(df.groupby(df['date'].dt.strftime('%B'))['price'].mean()) # Though now it is not as it was but instead the months appear alphabetically
- Haben Sie versucht
df.sort_values(by='Date_col', inplace=True)
, wie die Antworten auf diese Frage zeigen? - ja, ich vergaß, es zu erwähnen. Das problem verschärft sich, nachdem die Gruppe durch.Es wird nur alphabetisch nach dass.
- Okay, haben Sie versucht, die Anweisungen in die Antwort auf die Sortierung innerhalb dataframe Gruppen?
- die Anwesenheit von datetime benötigt, um sich von Monat in meinem Beispiel macht es schwer zu realisieren
- Wie über die Zuordnung der ersten Spalte einer Reihe von Indizes (also für jeden Monat speichern, was index es ist in der
months
array, anstatt des name-string), und Sortieren dann diese zahlen? - Versuchen
groupby(df['date'])['price'].mean())
in Ihrer letzten Zeile. - du meinst, entfernen Sie die
dt.strftime('%B')
? es funktioniert nicht - Es ist mir nicht ganz klar, was Ihre Daten tatsächlich aussieht (und Datentypen), aber wenn Sie die original-dataframe und es hat eine datetime-Spalte ist, sollten Sie in der Lage, sehr einfach tun:
df.resample('M').mean()
(dies setzt Voraus, die datetime-col wird als set-index und der Preis ist das einzige, col).
Du musst angemeldet sein, um einen Kommentar abzugeben.
Danke @Brad Solomon für das Angebot eines schnelleren Weg, um Kapital string!
Hinweis 1 @Brad Solomon ' s Antwort mit
pd.kategorische
speichern Sie Ihre Ressourcen besser als meine Antwort. Er zeigte, wie zu ordnen, um Ihre kategorische Daten. Sollten Sie sich nicht entgehen lassen 😛Alternativ, Sie verwenden können.
Note 2
groupby
standardmäßig sortiert die group-Tasten für Sie. Beachten Sie denselben Schlüssel verwenden, um zu Sortieren und groupby in derdf = df.sort_values(by=SAME_KEY)
undtotal = (df.groupby(df[SAME_KEY])['Price'].mean()).
Ansonsten kann man bekommt unerwünschte Verhalten. Sehen Groupby bewahren, um unter den Gruppen? In welcher Art und Weise? für weitere Informationen.Anmerkung 3
Eine weitere sehr effiziente Möglichkeit ist, zuerst berechnen Sie Mittelwert und führen Sie dann die Sortierung nach Monaten. Auf diese Weise müssen Sie nur zu Sortieren, die auf 12 items, anstatt die gesamte
df
. Es verringert sich der Rechenaufwand, wenn man nicht brauchendf
sortiert werden.Anmerkung 4 Für Menschen, die bereits
month
als index, und Frage mich, wie man es kategorisch, werfen Sie einen Blick auf pandas.CategoricalIndex
@jezrael hat ein Beispiel arbeiten auf der Herstellung der kategorische index bestellt Pandas-Serie Sortieren nach Monat indexapril
unddec
df["Month"].str.upper()
. - viel schneller als.apply
.df.sort_values(by="Month", inplace=True)
. Oder speichern Sie es zurück zudf
wie ich es Tat.groupby
ändern Sie die Reihenfolge, nach der Gruppierung von Streichern, so dass nur versuchen, den Stab mit ganzzahligen Darstellung der Monate, für jetzt.Können Sie kategoriale Daten, um die ordnungsgemäße Sortierung:
Wenn Sie angeben, dass die Kategorien, pandas erinnert sich an die Reihenfolge in der Spezifikation als die Standard-Sortierreihenfolge.
Docs: Pandas Kategorien > Sortierung & Bestellung.
Ich würde das
calender
Modul undreindex
:series.str.profitieren
hilft, Kapital zu schlagen aus der Serie , dann schaffen wir ein Wörterbuch mit dercalender
Modul undmap
mit der Serie um die Nummer des Monats.Haben wir erst einmal die Nummer des Monats können wir
sort_values()
und erhalten den index. Dannreindex
.verwenden Sort_Dataframeby_Month - Funktion zum Sortieren von Monatsnamen in chronologischer Reihenfolge
Pakete installieren müssen.
Beispiel:
Sortieren dataframe Monat verwenden Sie die folgende Funktion
Können Sie den numerischen Wert für Monat zusammen mit dem Namen im index (ich.e "01 Januar"), wollen eine Art strip off der Reihe:
Es sieht vielleicht JMD wie diese:
Sollten Sie erwägen, re-Indizierung basiert auf Achse 0 (Indizes)