如何从Pandas的groupby().mean()分组均值结果中提取单个数据值?
如何从Pandas的groupby().mean()分组均值结果中提取单个数据值?
我来帮你理清这个问题!首先得先搞清楚你手里的z1means到底是什么结构——你说它是DataFrame,没错,因为你用groupby(...).mean()的时候,是对选中的data列求均值,返回的是带多级索引的DataFrame。当你用means.loc['zone1']得到z1means后,它的行索引就是Setpoint的值(40、50...110),而唯一的列就是data(也就是你算出来的均值)。
正确的取值方法
这里有几种简单的方式可以拿到Setpoint=80对应的data值:
- 最清晰的方式:用
.loc指定行索引和列名
# 直接定位Setpoint=80的行,和data列 z1means.loc[80, 'data']
- 先取data列再按索引取值
因为z1means只有data一列,你可以先把这列单独取出来变成Series,再通过Setpoint索引取值:
z1means['data'].loc[80] # 或者更简洁(但.loc更推荐,避免歧义) z1means['data'][80]
- 用
.at快速访问单个元素.at是Pandas专门用来快速定位单个元素的属性,注意要用方括号(不是圆括号!你之前用圆括号所以报错了):
z1means.at[80, 'data']
为什么你之前的尝试失败了?
我来逐个解释你踩的坑:
z1means[80]:Pandas里[]对DataFrame来说是找列名,但你的z1means只有一列叫data,没有叫80的列,所以报KeyError。z1means.at(80):.at是属性不是方法,不能用圆括号调用,而且你没指定列名(因为是DataFrame,需要同时指定行和列)。z1means.loc(80):同样,.loc是属性要用方括号,而且只写80的话,返回的是Setpoint=80的整行(一个Series),如果要取data值,得写成z1means.loc[80]['data']。z1means.loc(z1means['Setpoint'] == 80):z1means里没有叫Setpoint的列!因为Setpoint已经变成了DataFrame的行索引,不是列了,所以z1means['Setpoint']会直接报错。
优化建议:让结果更易用
如果你希望后续取值更简单,可以在groupby的时候,只针对data列求均值,这样返回的是Series而不是DataFrame:
# 只对data列求均值,得到Series means = temps[['zone','Setpoint','data']].groupby(['zone','Setpoint'])['data'].mean() # 取zone1的结果,这时候z1means是Series,索引是Setpoint z1means = means.loc['zone1'] # 直接通过Setpoint值取值 z1means[80] # 或者 z1means.loc[80]
这样结构更简洁,取值也更直接。
内容来源于stack exchange
相关产品推荐
相关产品推荐

