You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

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

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.08.29 22:15:36