Pandas按df1>0条件计算df2行方向扩展均值报错解决
报错原因
你遇到的Cannot index with multidimensional key报错,本质是.loc索引器的第一个入参默认用于筛选行,不支持传入和DataFrame形状一致的二维布尔矩阵。除此之外你之前的写法还有两个逻辑问题:
- pandas原生
expanding().mean()不会自动跳过不符合掩码条件的数值,直接计算会把df1<=0位置的df2值也纳入统计 - 直接对切片结果赋值容易出现列索引错位,无法保证计算结果准确落回对应位置
正确实现思路
核心逻辑是利用pandas窗口计算默认跳过NaN值的特性:先把不符合筛选条件的位置替换为空值,再做扩展均值计算,全程分离前两列标识列避免误改,最后拼接回完整结果。
完整可运行代码如下:
import pandas as pd import datetime # --------------- 测试数据构造 实际使用时替换为你自己的df1/df2读取逻辑即可 --------------- df1 = pd.DataFrame({'Wellname': {0: '19A77', 1: '18A75', 2: '19A74', 3: '6A75', 4: '11A74'}, 'Padname': {0: '77', 1: '75', 2: '74', 3: '75', 4: '74'}, datetime.date(2021, 10, 1): {0: 7.482527,1: 8.539606,2: 0.0,3: 0.0,4: 0.0}, datetime.date(2021, 10, 2): {0: 7.482464,1: 8.538932,2: 8.436184,3: 0.0,4: 0.0}, datetime.date(2021, 10, 3): {0: 7.4810767,1: 0.0,2: 8.436184,3: 0.0,4: 0.0}, datetime.date(2021, 10, 4): {0: 7.4815946,1: 8.53787,2: 8.436478,3: 0.0,4: 0.0}}) df2 = pd.DataFrame({'Wellname': {0: '19A77', 1: '18A75', 2: '19A74', 3: '6A75', 4: '11A74'}, 'Padname': {0: '77', 1: '75', 2: '74', 3: '75', 4: '74'}, datetime.date(2021, 10, 1): {0: 0.03047586123578023,1: 0.012852623962781664,2: 0.0,3: 0.0,4: 0.0}, datetime.date(2021, 10, 2): {0: 0.03197930324012337,1: 0.013347760497657282,2: 0.0085677628558828,3: 0.0,4: 0.0}, datetime.date(2021, 10, 3): {0: 0.030553271599108457,1: 0.01472520929639739,2: 0.008857505630343878,3: 0.0,4: 0.0}, datetime.date(2021, 10, 4): {0: 0.0312492523780255,1: 0.013043631856251387,2: 0.009324431738911416,3: 0.0,4: 0.0}}) # --------------- 测试数据构造结束 --------------- # 核心计算步骤 # 1. 定位需要参与计算的列(从第三列/索引2开始) calc_cols = df1.columns[2:] # 2. 生成筛选掩码:对应位置df1取值>0标记为True mask = df1[calc_cols] > 0 # 3. 提取df2待计算部分,掩码为False的位置替换为空值,窗口计算会自动跳过空值 calc_data = df2[calc_cols].where(mask, other=pd.NA) # 4. 沿列方向做扩展均值计算 expanding_result = calc_data.expanding(axis=1).mean() # 5. 拼接前两列标识列,得到最终结果 final_result = pd.concat([df2.iloc[:, :2], expanding_result], axis=1)
结果校验
以索引为1的行(Wellname=18A75)为例,计算逻辑完全符合需求:
- 2021-10-01列:df1值>0,纳入计算,扩展均值为当前值0.012853
- 2021-10-02列:df1值>0,纳入计算,扩展均值为前两列有效数的均值(0.012853+0.013348)/2≈0.013100
- 2021-10-03列:df1值=0,不纳入计算,扩展均值保持之前有效数的均值≈0.013100
- 2021-10-04列:df1值>0,纳入计算,扩展均值为前三份有效数的均值≈0.013081
内容的提问来源于stack exchange,提问作者roudan
相关产品推荐
相关产品推荐

