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

如何正确使用Pandas的apply()方法?分组分类报错排查

解决Pandas中"The truth value of a Series is ambiguous"错误

问题根源

你的代码错误在于对groupby后的分组对象理解有误:

  • 使用groupby('country').apply(rank_level)时,每个传入rank_level的group是对应国家的所有机构组成的DataFrame,group["world_rank"]是包含多个数值的Series(比如一个国家可能有多个机构,对应多个排名)。
  • (group["world_rank"] < 101)会生成一个布尔Series,调用.bool()时,只有当该Series所有元素全为True或全为False时才会返回单个布尔值,否则就会触发你遇到的错误——因为Pandas无法确定一个包含多种布尔值的Series的"真值"到底是什么。
  • 更关键的是:你的需求是给每个机构单独按排名分类,而非给整个国家的所有机构统一分配一个等级,因此完全不需要用groupby。

正确解决方案

直接对DataFrame的每行数据做条件判断,推荐两种高效实现方式:

方式1:使用np.select

import pandas as pd
import numpy as np

df = pd.read_csv('datasets/cwurData.csv')

# 定义分类条件和对应等级
conditions = [
    df['world_rank'] <= 100,
    (df['world_rank'] > 100) & (df['world_rank'] <= 200),
    (df['world_rank'] > 200) & (df['world_rank'] <= 300)
]
rank_labels = ['First Tier', 'Second Tier', 'Third Tier']

# 生成新列,不符合上述条件的默认分配"Other Tiers"
df['rank_level'] = np.select(conditions, rank_labels, default='Other Tiers')

方式2:使用pd.cut(更适合区间分类场景)

import pandas as pd

df = pd.read_csv('datasets/cwurData.csv')

# 按排名区间直接划分等级
df['rank_level'] = pd.cut(
    df['world_rank'],
    bins=[0, 100, 200, 300, float('inf')],  # 定义区间边界
    labels=['First Tier', 'Second Tier', 'Third Tier', 'Other Tiers'],  # 对应区间的等级标签
    include_lowest=True  # 包含区间左端点
)

补充说明

如果你的真实需求是按国家做分组统计(比如统计每个国家各等级机构的数量),可以先按上述方式生成rank_level列,再执行分组操作:

country_rank_stats = df.groupby(['country', 'rank_level']).size().unstack(fill_value=0)

内容的提问来源于stack exchange,提问作者João Vitor Belintane Fermiano

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.08.02 17:30:58