Pandas中groupby后调用apply()传入axis参数报错的疑问
Pandas中groupby后调用apply()传入axis参数报错的疑问
你遇到的问题场景是这样的:
运行这段代码时:
display(ch2m_cpaf.groupby('PROVIDING_COMPANY_CODE').apply(lambda df: df, axis=0))
会触发报错:
TypeError: () got an unexpected keyword argument 'axis'
你疑惑为什么axis=0不能作为lambda的参数,还尝试把它放进括号,想返回Series对象。
嗨,我来帮你捋清楚这个问题哈!
首先,报错的直接原因很简单:你写的lambda函数lambda df: df只定义了一个参数df,但你在调用apply的时候,给这个lambda硬塞了axis=0这个额外的关键字参数——就像你给一个只收一份礼物的朋友塞了两份,人家肯定会懵呀😅。
然后咱们说说groupby.apply的逻辑:当你对分组后的对象用apply时,Pandas会自动把每个分组的子DataFrame/Series作为第一个参数传给你的lambda函数,而axis这个参数根本不是要传给lambda的!而且对于groupby后的apply来说,本身也不需要指定axis——分组操作已经帮你把数据按PROVIDING_COMPANY_CODE列划分成了一个个子数据集,你只需要在lambda里对传入的df(每个分组)做操作就行。
你想返回Series对象的话,完全不需要加axis=0,给你几个实用的写法参考:
- 提取每个分组的某一列作为Series:
lambda df: df['你要的列名'] - 把整个分组的DataFrame转成一维Series:
lambda df: df.stack() - 如果分组是单行数据,直接转成Series:
lambda df: df.squeeze()
总结一下:你的lambda函数只接受一个参数df,你额外传的axis=0它根本“接不住”,所以才会报错;想要返回Series,直接对传入的df做对应转换就好啦。
备注:内容来源于stack exchange,提问作者gio




