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

按ID分组求均值后拆分Pandas DataFrame的报错求助

解决方法

问题原因

你报错的核心原因是直接用两个索引/标签不匹配的Series做==比较,Pandas会强制要求两个Series的标签完全一致才能逐元素比较,而你筛选后的df_avg.loc[df_avg['Val'] < 55]['ID']和原df['ID']的索引长度、标签都不一样,所以触发ValueError。另外你代码里还有个笔误:df_avg['Price']应该改成df_avg['Val'],因为你的分组均值列是Val,不存在Price列。

正确实现步骤

  1. 提取均值低于阈值的所有ID值(转成列表/集合,摆脱索引限制)
  2. 用isin()方法判断原DataFrame的ID是否属于这个集合,生成布尔索引
  3. 基于布尔索引拆分出两个DataFrame

完整代码

import pandas as pd

dict_ = {'ID': ['abc', 'def', 'def', 'abc'], 'Val' : [1, 57, 65, 9]}
df = pd.DataFrame.from_dict(dict_)

# 分组求均值
df_avg = df.groupby('ID', as_index=False)['Val'].mean()

# 阈值设定
threshold = 55

# 获取均值低于阈值的ID列表
low_ids = df_avg.loc[df_avg['Val'] < threshold, 'ID'].tolist()

# 拆分DataFrame
df_low = df[df['ID'].isin(low_ids)]
df_high = df[~df['ID'].isin(low_ids)]

# 验证结果
print("均值低于阈值的DataFrame:")
print(df_low)
print("\n均值高于阈值的DataFrame:")
print(df_high)

代码说明

  • tolist()把筛选后的ID Series转成普通列表,彻底脱离Pandas的索引约束
  • isin()只检查ID值是否在目标列表中,完全不关注原Series的索引,完美解决标签不匹配的问题
  • ~符号用来取反,得到均值高于阈值的行

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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.07.27 07:33:07