在groupby上操作并在pandas中的数据帧上连接结果

时间:2015-06-23 13:04:06

标签: python pandas

我尝试按日期对数据帧组的结果进行线性回归,并将结果聚合到另一个数据帧上。到目前为止我使用的是中间系列:

数据框类似于

marker    date         variable       identifier  value
EA    2007-01-01      0.33            55          123
EA    2007-01-01      0.73            56          1123
EA    2007-01-01      0.51            57          123
EA    2007-02-01      0.13            55          4446
EA    2007-02-01      0.23            57          667
EA    2007-03-01      0.82            55          5675
EA    2007-03-01      0.88            56          1
EB    2007-01-01      0.13            45          123
EB    2007-01-01      0.74            46          33234
EB    2007-01-01      0.56            47          111
EB    2007-02-01      0.93            45          42657
EB    2007-02-01      0.23            47          12321355
EB    2007-03-01      0.82            45          9897
EB    2007-03-01      0.38            46          786
EB    2007-03-01      0.19            47          993845

代码段:

import statsmodels as sm
import pandas as pd



reg_results = pd.Series(name='reg_results')
mean_results = pd.Series(name='mean_results')
for date, group in df.groupby(df.index.date):
    formula = sm.formula.ols('value ~ variable', data=group).fit()
    reg_results.set_value(date.strftime("%Y-%m-%d"), formula.params['Intercept'] + formula.params['variable']*group['variable'])
    mean_results.set_value(date.strftime("%Y-%m-%d"), group.mean()['variable'])

final_df = pd.DataFrame()
final_df = pd.concat([reg_results, mean_results], axis=1)

还有其他操作,例如组中的第二个groupby等,所以我可以为每个要创建的操作创建一个系列,这非常复杂。有没有办法一步到位,或者至少没有中间序列?

1 个答案:

答案 0 :(得分:1)

除了

之外,你的代码看起来还不错

这类似于您的代码(我刚刚登录的计算机没有安装statsmodels

res = df.groupby(df.date).apply(lambda g: pd.Series({'mean': g.variable.mean(), 'min': g.variable.min()}))

(请注意,在此示例中,df.date,您有点不同。)

这就像你的OLS一样,每个群体都要做一些事情,以及多个回归值。在您的情况下,您将使用一个函数来获取一个组并返回一系列OLS结果。

现在我们已经拥有了它,它只是

pd.concat([df, res], axis=1)

请注意axis=1 - it means to concat horizontally,我相信这就是您的意思。