基于DataFrame行内分位数条件的逐行均值计算问题
没问题,我来帮你搞定这个基于行内分位数的逐行均值计算需求!
核心思路
我们需要对每一行做三件事:
- 计算
df_condition当前行的40分位数 - 筛选出
df_condition中大于等于该行40分位数的列位置 - 用这些位置对应的
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
相关产品推荐
相关产品推荐

