如何在Pandas GroupBy中计算分组内字符串的平均长度?
解决方法
你的问题和索引深度无关,核心是原代码没有正确计算每个评论描述的字符串长度,反而统计了每组的样本数量,最后还对这些样本数求了全局均值,所以只得到一个总数值。
问题拆解
reviews.groupby(['country','variety']).description.apply(lambda x: len(x))里的x是分组后的整个Series,len(x)返回的是该组的行数(即该国家-品种组合的样本数),不是每个描述的字符串长度。- 后续的
.mean()是对所有组的样本数求平均,自然得到全局总均值,而非每组的平均描述长度。
正确写法
有三种简洁的实现方式,任选其一即可:
方式1:先新增长度列再分组求均值(可读性最高)
# 为每条评论计算描述字符串的长度,新增一列 reviews['desc_length'] = reviews['description'].str.len() # 按国家+品种分组,计算每组的平均描述长度 average_desc = reviews.groupby(['country', 'variety'])['desc_length'].mean()
方式2:直接在分组后链式计算
average_desc = reviews.groupby(['country', 'variety'])['description'].apply(lambda x: x.str.len().mean())
方式3:用agg方法更清晰
average_desc = reviews.groupby(['country', 'variety'])['description'].agg(lambda x: x.str.len().mean())
原理说明
x.str.len()会遍历组内的每一条description字符串,单独计算其长度,生成一个数值型Series;再对这个Series调用.mean(),就能得到该国家-品种组合下所有评论描述的平均长度。
内容的提问来源于stack exchange,提问作者Irving Rabin
相关产品推荐
相关产品推荐

