Python pandas计算特定行数值与目标均值的百分比偏差方法问询
解决方案
核心实现逻辑
pandas 原生支持向量化运算,无需循环即可逐行计算百分比偏差,完全适配你的需求,不需要用pct_change(该方法仅适合同序列相邻元素的变化率计算,不适用与固定均值/对应列值的偏差计算),你之前尝试的索引修改方案和当前需求无关,无需使用。
具体代码实现
场景1:每行对应均值已经存储在mean列中
如果你的每一行价格对应的目标均值都已经提前计算好、存储在mean列,直接按如下方式计算即可:
df['pct_difference'] = (df['price'] - df['mean']) / df['mean'] * 100
按你给出的示例,均值10、价格8时,计算结果为-20,即价格比均值低20%,完全符合预期。
场景2:均值是固定的全局值(比如ab roller类别的全局平均价)
如果目标均值是提前计算好的固定值,比如所有ab roller商品的平均价格,先提取均值再计算即可:
# 先计算ab roller类别对应的全局平均价 ab_roller_mean = df.loc[df['tertiary_tag'] == 'ab roller', 'price'].mean() # 逐行计算每个商品价格相对该均值的偏差 df['pct_difference'] = (df['price'] - ab_roller_mean) / ab_roller_mean * 100
原代码问题说明
你原来写的df['tertiary_tag']['price']属于链式索引,容易触发SettingWithCopyWarning,如果你的DataFrame是多级列结构,推荐用如下方式取值:
# 多级列正确取值方式,避免链式索引警告 price_col = df.loc[:, ('tertiary_tag', 'price')] mean_col = df.loc[:, ('ab roller', 'mean')] df['pct_difference'] = (price_col - mean_col) / mean_col * 100
内容的提问来源于stack exchange,提问作者Ken
相关产品推荐
相关产品推荐

