将函数或Lambda应用于Pandas GROUPBY

时间:2018-01-10 08:59:17

标签: python pandas lambda statsmodels pandas-groupby

我想将特定函数(在本例中为logit模型)应用于可以分组的数据框(通过变量“model”)。我知道任务可以通过循环执行,但我认为这样做效率最低。示例代码如下:

import pandas as pd
import numpy as np
import statsmodels.api as sm
df1=pd.DataFrame(np.random.randint(0,100,size=(100,10)),columns=list('abcdefghij'))
df2=pd.DataFrame(np.random.randint(0,100,size=(100,10)),columns=list('abcdefghij'))
df1['model']=1
df1['target']=np.random.randint(2,size=100)
df2['model']=2
df2['target']=np.random.randint(2,size=100)
data=pd.concat([df1,df2])
### Clunky, but works...  
for i in range(1,2+1):
    lm=sm.Logit(data[data['model']==i]['target'],
                sm.add_constant(data[data['model']==i].drop(['target'],axis=1))).fit(disp=0)
    print(lm.summary2())
### Can this work?  
def elegant(self):
    lm=sm.Logit(data['target'],
                sm.add_constant(data.drop(['target'],axis=1))).fit(disp=0)
better=data.groupby(['model']).apply(elegant)

如果上面的groupby可以工作,这比循环更有效吗?

1 个答案:

答案 0 :(得分:1)

这可行:

def elegant(df):
lm = sm.Logit(df['target'],
              sm.add_constant(df.drop(['target'],axis=1))).fit(disp=0)
return lm 

better = data.groupby('model').apply(elegant)

使用.apply将数据框组传递给函数elegant,因此elegant必须将数据框作为第一个参数。此外,您的函数需要返回计算结果lm

对于更复杂的功能,可以使用以下结构:

def some_fun(df, kw_param=1):
# some calculations to df using kw_param
return df

better = data.groupby('model').apply(lambda group: some_func(group, kw_param=99))