Pandas groupby+mean取values返回数组 如何获取float类型单个值
Pandas分组聚合后提取float类型单个标量值的方法
问题复现代码
import pandas as pd ipl_data = {'Team': ['Riders', 'Riders', 'Devils', 'Devils', 'Kings', 'kings', 'Kings', 'Kings', 'Riders', 'Royals', 'Royals', 'Riders'], 'region': [1, 2, 2, 3, 3,4 ,1 ,1,2 , 4,1,2], 'Year': [2014,2015,2014,2015,2014,2015,2016,2017,2016,2014,2015,2017], 'Points':[876,789,863,673,741,812,756,788,694,701,804,690], 'time':[71,21,8,63,41,12,56,88,94,21,42,90], } df = pd.DataFrame(ipl_data) # 原写法,返回单元素数组 df[df.region==2].groupby('time').mean().values[0] # 输出格式:array([Value])
原因说明
原写法返回数组是因为:
- 没有显式指定要聚合的列,
mean()会对所有数值列同时计算均值,返回的是DataFrame结构 - 对DataFrame取
.values[0]得到的是对应行所有列值组成的一维numpy数组,不是单个标量
实现方法
推荐优先用显式指定列的写法,避免取错值:
- 方法1:指定聚合列后用
iloc取第一个值,直接得到float类型结果
# 示例为取Points列的均值,替换成你需要的列名即可 float_val = df[df.region==2].groupby('time')['Points'].mean().iloc[0]
- 方法2:对单元素结构调用
.item()方法,直接提取原生Python标量
# 适配Series/单元素numpy数组的场景 float_val = df[df.region==2].groupby('time')['Points'].mean().iloc[0].item() # 如果是你已经拿到的单元素数组,也可以直接取索引后转标量 float_val = df[df.region==2].groupby('time').mean().values[0][0].item()
注意:如果不指定聚合列,
.values[0]会包含region、Year、Points三个列的均值,属于多元素数组,直接取[0]拿到的是region列的均值,大概率不是你需要的结果,一定要显式声明要计算的列。
内容的提问来源于stack exchange,提问作者Anant
相关产品推荐
相关产品推荐

