您传递给的函数
apply必须以a
pandas.Dataframe作为第一个参数。您可以将其他关键字或位置参数
apply传递给该参数或传递给应用函数。因此,您的示例将进行少量修改即可工作。更改
ols_res为
def ols_res(df, xcols, ycol): return sm.OLS(df[ycol], df[xcols]).fit().predict()
然后,你可以使用
groupby和
apply喜欢这个
df.groupby('grp').apply(ols_res, xcols=['x1', 'x2'], ycol='y')要么
df.groupby('grp').apply(ols_res, ['x1', 'x2'], 'y')编辑
上面的代码并 没有 运行多个 单变量 回归。相反,它每组运行一个 多元 回归。但是(稍作修改)它将实现。
def ols_res(df, xcols, ycol): return pd.Dataframe({xcol : sm.OLS(df[ycol], df[xcol]).fit().predict() for xcol in xcols})编辑2
虽然上述解决方案有效,但我认为以下内容更实用-
import statsmodels.api as smimport pandas as pdimport numpy as npdf = pd.Dataframe({ 'y': np.random.randn(20), 'x1': np.random.randn(20), 'x2': np.random.randn(20), 'grp': ['a', 'b'] * 10})def ols_res(x, y): return pd.Series(sm.OLS(y, x).fit().predict())df.groupby('grp').apply(lambda x : x[['x1', 'x2']].apply(ols_res, y=x['y']))由于某种原因,如果我
ols_res()按原样定义,则结果
Dataframe在索引中没有组标签。



