如何正确使用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
相关产品推荐
相关产品推荐

