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

Pandas中groupby.transform与直接调用std()的差异及空值原因

Pandas中groupby.transform()与直接聚合的差异分析

问题背景

在Datacamp第7模块学习时,需按分组列计算均值、中位数和标准差(例如计算不同航空公司的价格标准差),使用的示例数据planes.csv内容如下:

Airline,Price
Delta,350
United,420
American Airlines,380
Delta,320
Southwest,250
United,400
American Airlines,410
Delta,300
Southwest,280
United,390
American Airlines,430

现有两段Pandas代码:

import pandas as pd
import matplotlib.pyplot as plt
import seaborn as sns
import numpy as np

# 这段代码正确
planes["airline_price_st_dev"] = planes.groupby("Airline")\
                                            ["Price"].transform(lambda x: x.std())

print(planes[["Airline", "airline_price_st_dev"]].value_counts())

# 这段代码不正确
planes["airline_price_st_dev"] = planes.groupby("Airline")\
                                            ["Price"].std()

print(planes[["Airline", "airline_price_st_dev"]].value_counts())

提问:这两段代码的差异是什么?为什么第二段代码会返回空列表?


代码差异与问题原因

1. groupby.transform()的工作逻辑

groupby.transform(lambda x: x.std())的核心是保留原数据的行数结构:它会对每个分组计算标准差,然后将该值广播到分组内的每一行。最终生成的结果和原planes DataFrame的行数完全一致(11行),每一行都对应所属航空公司的价格标准差。

此时调用value_counts(),可以正常统计不同航空公司与对应标准差的组合出现次数,结果符合预期。

2. 直接调用groupby.std()的问题

planes.groupby("Airline")["Price"].std()返回的是一个分组聚合后的Series,仅包含4行数据(对应4个不同的航空公司,索引为航空公司名称)。

当把这个短Series赋值给原DataFrame的新列时,Pandas会按照索引匹配赋值。原planes的索引是默认的0-10数字索引,和聚合后Series的字符串索引完全不匹配,导致新列airline_price_st_dev的所有值都变为NaN。

而value_counts()方法默认会排除NaN值,因此最后打印的结果是空列表。


内容的提问来源于stack exchange,提问作者Manuel Veiga

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.07.12 10:53:11