【问题标题】:Group data in pandas dataframe for every n years每 n 年在 pandas 数据框中对数据进行分组
【发布时间】:2017-06-24 02:29:26
【问题描述】:
我在数据框中有按年份分组的数据。我有一列,其中有年份,后面是这些年份的各个列中的数据。是否可以每五年对数据进行分组?
Year Column
1991 2
1992 3
1993 5
1994 7
1995 8
1996 9
1997 7
我需要将 1991 年至 1995 年的数据归为一组,将 1996 年至 1997 年的数据归为一组,并取这些值的平均值。如何执行这个 groupby 操作?
【问题讨论】:
标签:
python
pandas
pandas-groupby
【解决方案1】:
如果标签无关紧要,总是可以转换为更有意义的值,如1991-1995,你可以这样做:
df.Column.groupby(df.Year.sub(1991)//5).mean()
#Year
#0 5
#1 8
#Name: Column, dtype: int64
【解决方案2】:
只需使用df.groupby(df.index//5).mean()。
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
【解决方案3】:
您可以在这里使用剪切功能:
your_data_frame.groupby(pd.cut(your_data_frame["Year"], np.arange(0, 1991, 1995)))
【解决方案4】:
您可以使用groupby by numpy.arange 进行楼层划分并通过agg - mean 聚合,对于年份范围还可以使用first 和last。
将map 和insert 列中的MultiIndex 删除到astype 的第一个位置,最后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