2017-10-15 6 views
0

Ich versuche, den Datenrahmen zu erhalten, Ergebnisse in der Reihenfolge des Monats auszudrucken. Wenn ich den Monat zu Monat Name nicht ändere und als int (zB 1: 4, 2: 94) lasse, wird es chronologische Reihenfolge sein, aber der Moment, in dem ich zum Monatsnamen wechsel, wird in der Reihenfolge von Monaten in alphabetischer Reihenfolge geordnet.Pandas Dataframe Monat Int zu Monat Name in Reihenfolge

Wenn ich sort = False, gibt es mich in zufälliger Reihenfolge zurück. Schätze jede Hilfe, die ich bekommen kann! Vielen Dank!

order_group_df = pd.DataFrame({'Property Name': Propertyname, 'Reported on': ReportedDateList, 'Category': Catname}) 
order_group_df['Reported on'] = pd.to_datetime(order_group_df['Reported on'], format='%m/%d/%Y %H:%M', errors='coerce') 
order_group_df = order_group_df.dropna() 
a = order_group_df.groupby([order_group_df['Reported on'].dt.month.apply(mapper)], sort=False).agg({'count'}).iloc[:, :-2] 

print a 



Results:   
       count 
Reported on  
Feb    94 
Mar    306 
Jan    4 
Jun    9 
Aug    6 
Sep    2 
Oct    2 
Nov    1 
Apr    1 
Jul    5 
+0

Warum verwenden Sie nicht die chronologische Reihenfolge, wie es funktioniert, und sortiert Ihren Monat basierend auf 1., 2., 3. Monat? – ALH

+0

Wenn ich chronologische Reihenfolge verwende, bin ich mir nicht sicher, wo ich den Monat platzieren und anwenden sollte. – 03131992

Antwort

0

Sie pandas.Categorical mit dem Parameter ordered=True verwenden können. Sie können jede gewünschte Reihenfolge mit dem Argument categories definieren.

months_order = ["Jan", "Feb", "Mar", "Apr"] 
cat = pd.Categorical(["Mar", "Feb", "Apr", "Jan"], 
        categories=months_order, ordered=True) 

Printing cat geben

[Mar, Feb, Jan, Apr] 
Categories (4, object): [Jan < Feb < Mar < Apr] 

Und cat.sort_values() geben Druck

[Jan, Feb, Mar, Apr] 
Categories (4, object): [Jan < Feb < Mar < Apr] 

EDIT: In Ihrem Fall können Sie groupby Argument

order_group_df['Reported on'].dt.month.apply(mapper) 
ersetzen

von

pd.Categorical(order_group_df['Reported on'].dt.month.apply(mapper), 
       categories=['Jan', ..., 'Dec'], 
       ordered=True) 
0

Vor allem Pandas macht das nicht für uns. Also müssen wir einen Trick verwenden.

Zunächst einmal ist dies eine Probe Dataframe:

df = DataFrame({'month_name': ['Apr', 'Jan', 'Sep', 'Mar'], 'counts': [13, 12, 13, 9]}) 
print df 

Sein Ausgang ist:

 counts month_name 
0  13  Apr 
1  12  Jan 
2  13  Sep 
3  9  Mar 

Und der Trick ist, Monatszahl (mit range) zu erstellen und sie in einem Wörterbuch setzen durch der Schlüssel des Monatsnamens (%b).

months = {} 
for date_idx in range(1, 13): 
    month_name = datetime.datetime(2020, date_idx, 1).strftime("%b") 
    months[month_name] = date_idx 

Es schafft ein Wörterbuch, das wir zur Karte in unsere Dataframe verwenden.

Karte nun das Ergebnis:

df["month_number"] = df["month_name"].map(months) 

In der obigen wir Dataframe basierend auf seinen Namen und legte Monatszahl des Wörterbuchs in Dataframe Spalte month_number genannt Karte.

Der letzte Schritt ist die Dataframe basierend auf seiner Monatszahl zu sortieren, wie unten:

sorted_df = df.sort_values(by=['month_number']) 

Der Ausgang des letzten Dataframe wäre:

 counts month_name month_number 
1  12  Jan    1 
3  9  Mar    3 
0  13  Apr    4 
2  13  Sep    9 

Sie können nun month_number in Python entfernen weg:

del new_df['month_number'] 

Oder in Pandas Weg:

new_df.drop('month_number', axis=1, inplace=True) 
+0

Hallo, nachdem ich dies versucht habe, erhalte ich einen Fehler, weil meine Monatsnummer NaN ist. Das dt.month wurde auch nicht verarbeitet – 03131992

0

Verwenden Sort_Dataframeby_MonthandNumeric_cols Funktion Datenrahmen für Monat und numerische Spalte sortieren:

Sie benötigen zwei Pakete installieren, finden Sie weiter unten.

pip install sorted-months-weekdays 
pip install sort-dataframeby-monthorweek 

Beispiel:

import pandas as pd 

from sorted_months_weekdays import * 

from sort_dataframeby_monthorweek import * 

df = pd.DataFrame([['Jan',23],['Jan',16],['Dec',35],['Apr',79],['Mar',53], ['Mar',12],['Feb',3]], columns=['Month','Sum']) 
df 
Out[11]: 
    Month Sum 
0 Jan 23 
1 Jan 16 
2 Dec 35 
3 Apr 79 
4 Mar 53 
5 Mar 12 
6 Feb 3 

Um Datenrahmen für Monat und numerische Spalte können Sie über Funktion gewöhnen sortiert.

Sort_Dataframeby_MonthandNumeric_cols(df = df, monthcolumn='Month',numericcolumn='Sum') 
Out[12]: 
    Month Sum 
0 Jan 16 
1 Jan 23 
2 Feb 3 
3 Mar 12 
4 Mar 53 
5 Apr 79 
6 Dec 35