基于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
相关产品推荐
相关产品推荐

