使用lambda函数计算累积均值的代码相关技术疑问
问题解答
1. axis=1的作用及为何按行迭代用1而非0
在pandas的apply方法中,axis参数定义了函数要作用的维度:
axis=0:函数沿着行的方向作用,即对每一列的数据进行批量处理axis=1:函数沿着列的方向作用,即对每一行的数据进行单独处理
你需要对每一行执行lambda逻辑,所以必须指定axis=1——此时lambda里的x会代表DataFrame中的单一行(Series对象)。如果误用axis=0,lambda会接收整列的数据,完全不符合你的需求。
2. 可以避免创建index列,直接使用原索引
完全没必要通过reset_index()生成额外的index列,原DataFrame本身就自带默认整数索引,直接用这个索引就能实现逻辑。而且你当前的apply写法效率极低,推荐用pandas内置的expanding方法计算累积均值,代码更简洁高效:
# 优化后的高效代码 res_df = pd.Series([2,10,3,1]).to_frame(name='val') res_df['cum_mean'] = res_df['val'].expanding().mean()
如果要保留你原本的逻辑(不用expanding),也可以直接借助原索引实现:
res_df = pd.Series([2,10,3,1]).to_frame(name='val') res_df['cum_mean'] = res_df.apply(lambda x: res_df.loc[:x.name, 'val'].mean(), axis=1)
这里x.name就是当前行的原索引值,用loc[:x.name]就能选取从开头到当前行的所有数据。
内容的提问来源于stack exchange,提问作者Mikhail Le
相关产品推荐
相关产品推荐

