2017-06-24 3 views
2

Ich habe Daten nach Jahr in einem Datenfeld gruppiert. Ich habe eine Spalte mit dem Jahr, gefolgt von Daten in verschiedenen Spalten für jedes dieser Jahre. Ist es möglich, die Daten alle fünf Jahre zu gruppieren?Gruppendaten in Pandas Datenrahmen für alle n Jahre

Year Column 
1991 2 
1992 3 
1993 5 
1994 7 
1995 8 
1996 9 
1997 7 

Ich brauche diese Daten 1991-1995 als einer der Gruppe und von 1996 bis 1997 als ein und den Mittelwert der Werte annehmen. Wie führe ich diese groupby Operation durch?

Antwort

4

Wenn das Etikett keine Rolle spielt, die immer mehr sinnvolle Werte wie 1991-1995 umgewandelt werden können, können Sie tun:

df.Column.groupby(df.Year.sub(1991)//5).mean() 

#Year 
#0 5 
#1 8 
#Name: Column, dtype: int64 
4

Nur df.groupby(df.index//5).mean() verwenden.

In [21]: df 
Out[21]: 
    Year Column 
0 1991  2 
1 1992  3 
2 1993  5 
3 1994  7 
4 1995  8 
5 1996  9 
6 1997  7 

In [22]: df.groupby(df.index//5).mean() 
Out[22]: 
    Column 
0  5 
1  8 
0

können Sie die Schnittfunktion hier verwenden:

your_data_frame.groupby(pd.cut(your_data_frame["Year"], np.arange(0, 1991, 1995))) 
0

Sie groupby von numpy.arange mit Boden Teilung und Aggregate von agg verwenden können - mean und für Bereiche von Jahren auch first und last.

entfernen Multiindex in Spalten von map und insert neue Spalte in die erste Position mit astype und letzten Spalten entfernen, indem drop:

print (np.arange(len(df.index))//5) 
[0 0 0 0 0 1 1] 

df1 = df.groupby(np.arange(len(df.index))//5).agg({'Column':'mean','Year':['first', 'last']}) 
df1.columns = df1.columns.map('_'.join) 
df1.insert(0, 'Years', df1['Year_first'].astype(str) + '-' + df1['Year_last'].astype(str)) 
#instead insert if is not necessary first position of column 
#df1['Years'] = df1['Year_first'].astype(str) + '-' + df1['Year_last'].astype(str) 
df1.drop(['Year_first','Year_last'], axis=1, inplace=True) 
print (df1) 
     Years Column_mean 
0 1991-1995   5 
1 1996-1997   8 
Verwandte Themen