Python Pandas groupby并将结果返回到原始的Pandas Data Frame

时间:2014-02-11 12:30:45

标签: python pandas

我使用Pandas创建了一个包含6年月度数据的DataFrame。然后我创建了一个只有前5年数据的DataFrame。我在每个月(1月 - 12月)的5年内按月返回最大值和最小值。

这样我可以绘制当前年度的前5年范围。

这是我在下面的方式,但它有点冗长。我想任何建议让它更清洁。

DF = pd.Series(np.random.randn(72), index=pd.date_range('1/1/2000', periods=72, freq='M'))


DF5y = DF['2000':'2004']

by = lambda x: lambda y: getattr(y, x)

Max5y = DF5y.groupby([by('month')]).max()
Min5y = DF5y.groupby([by('month')]).max()

MaxbyMonthDates = pd.Series(Max5y.values, index=pd.date_range('1/1/2005', periods=12, freq='M'))

MinbyMonthDates = pd.Series(Min5y.values, index=pd.date_range('1/1/2005', periods=12, freq='M'))


keys1 = ['DF', 'MaxbyMonthDates' , 'MinbyMonthDates']

DF_5yr_Range = pd.concat([DF, MaxbyMonthDates, MinbyMonthDates], axis=1, keys=keys1)


DF_5yr_Range.tail(15)
Out[13]: 
                  DF  MaxbyMonthDates  MinbyMonthDates
2004-10-31 -0.154463              NaN              NaN
2004-11-30 -1.085822              NaN              NaN
2004-12-31 -0.462416              NaN              NaN
2005-01-31  2.422458         0.439354         0.439354
2005-02-28 -1.033706         2.308936         2.308936
2005-03-31 -0.020724         0.333981         0.333981
2005-04-30 -0.901237         1.810083         1.810083
2005-05-31 -0.890278         1.538757         1.538757
2005-06-30 -1.412531         1.416770         1.416770
2005-07-31  1.640020         1.903341         1.903341
2005-08-31  0.897491         2.001736         2.001736
2005-09-30 -0.690588         0.798006         0.798006
2005-10-31 -0.768929         1.276541         1.276541
2005-11-30 -1.618866         0.347229         0.347229
2005-12-31  0.160188        -0.046892        -0.046892

1 个答案:

答案 0 :(得分:1)

怎么样:

import pandas as pd
import seaborn as sns
import numpy as np

df = pd.Series(np.random.randn(72), index=pd.date_range('1/1/2000', periods=72, freq='M'))

grouped = df.groupby(df.index.map(lambda x: x.month))
mnthmax, mnthmin = grouped.transform(max), grouped.transform(min)
df2 = pd.concat([df, mnthmax, mnthmin], axis=1)
df2.columns = ['data', 'max', 'min']

df2['2001'].plot()

给予,例如。 2001:

enter image description here