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

基于DataFrame行内分位数条件的逐行均值计算问题

没问题,我来帮你搞定这个基于行内分位数的逐行均值计算需求!

核心思路

我们需要对每一行做三件事:

  1. 计算df_condition当前行的40分位数
  2. 筛选出df_condition中大于等于该行40分位数的列位置
  3. 用这些位置对应的df_to_average的值计算均值

解决方案(两种实现方式)

首先先确认我们的基础数据:

import pandas as pd
import numpy as np

df_to_average = pd.DataFrame([[1,2,3],[2,3,4],[3,4,5]],columns=['A','B','C'])
df_condition = pd.DataFrame([[.2,.5,.3],[.5,.3,.4],[.3,.4,.5]],columns= ['A','B','C'])

方法1:直观的逐行apply实现

这种方式逻辑清晰,适合小数据集:

# 逐行计算符合条件的均值
df_results = df_to_average.apply(
    lambda row: row[df_condition.loc[row.name] >= df_condition.loc[row.name].quantile(0.4)].mean(),
    axis=1
).rename('Average')

# 查看结果
print(df_results)

代码解释:

  • apply(axis=1):遍历df_to_average的每一行
  • row.name:获取当前行的索引,用来定位df_condition中对应的行
  • df_condition.loc[row.name].quantile(0.4):计算当前行的40分位数
  • row[布尔掩码]:筛选出df_to_average中符合条件的列值,最后用mean()求均值

方法2:广播式高效实现(适合大数据集)

如果你的数据量很大,这种向量化操作的效率会比apply高很多:

# 1. 计算每行的40分位数
row_quantiles = df_condition.quantile(0.4, axis=1)

# 2. 创建布尔掩码:标记每行中符合条件的列
mask = df_condition >= row_quantiles[:, np.newaxis]

# 3. 计算均值:求和后除以符合条件的列数(自动忽略无符合条件的行,返回NaN)
df_results = (df_to_average * mask).sum(axis=1) / mask.sum(axis=1).replace(0, np.nan)
df_results = df_results.rename('Average')

# 查看结果
print(df_results)

代码解释:

  • row_quantiles[:, np.newaxis]:把一维的分位数Series转成列向量,实现和二维的df_condition广播比较
  • df_to_average * mask:把不符合条件的位置置为0,求和后除以符合条件的列数,得到均值
  • replace(0, np.nan):避免出现“除以0”的错误,无符合条件的行结果会显示NaN

验证结果

两种方法得到的结果一致:

0    2.5
1    3.0
2    4.5
Name: Average, dtype: float64

完全符合你示例中的预期(第一行均值2.5,第二行3.0,第三行4.5)。

内容的提问来源于stack exchange,提问作者Lko

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.05.08 19:18:12