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

基于Pandas GroupBy筛选平均质量最低的星球及对应角色

解决Star Wars角色数据的两个需求:找平均质量最低的星球及对应角色

步骤1:计算各星球的平均质量并找到最低值对应的星球

首先需要过滤掉mass无效的行(比如值为0或空值,避免拉低平均值的准确性),再按homeworld分组计算每个星球的平均质量,最后定位到平均质量最低的星球:

# 筛选mass有效数据,计算各星球平均质量
avg_mass_per_world = df[df['mass'] > 0].groupby('homeworld')['mass'].mean()
# 获取平均质量最低的星球名称
lowest_avg_mass_world = avg_mass_per_world.idxmin()

步骤2:用filter函数筛选该星球的所有角色

利用groupby().filter()方法,通过lambda函数判断当前分组的星球名称是否等于我们找到的目标星球,即可筛选出对应星球的所有角色:

# 筛选目标星球的全部角色数据
target_world_characters = df.groupby('homeworld').filter(lambda group: group.name == lowest_avg_mass_world)

完整代码示例

把两步逻辑整合,直接得到结果:

# 1. 定位平均质量最低的星球
avg_mass = df[df['mass'] > 0].groupby('homeworld')['mass'].mean()
lowest_avg_world = avg_mass.idxmin()

# 2. 筛选该星球的所有角色
target_characters = df.groupby('homeworld').filter(lambda g: g.name == lowest_avg_world)

# 输出结果
print(f"平均质量最低的星球:{lowest_avg_world}")
print("该星球的所有角色:")
print(target_characters)

原代码无效的原因

你之前的df.groupby(["homeworld"]).filter(lambda row: row['mass'].mean() > 0).min()存在逻辑问题:

  • filter的lambda参数是整个分组,不是单行数据,用row命名容易混淆;
  • 你用filter仅筛选出了平均质量大于0的星球,但后续的min()是对整个筛选后的DataFrame取各列最小值,并非定位平均质量最低的星球;
  • 要找到目标星球,必须先计算各星球的平均值,再取最小值对应的星球名称,无法直接在filter内部完成min逻辑。

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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.08.06 09:20:43