你可以使用结合起来groupby
,transform
和mean
.请注意,我已经修改了您的示例,因为否则两个Sections具有相同的平均值.从...开始
In [21]: df Out[21]: Name Sex Section Price 0 Joe M 1 2.0 1 Bob M 1 NaN 2 Nancy F 2 5.0 3 Grace F 1 6.0 4 Jen F 2 10.0 5 Paul M 2 NaN
我们可以用
df["Price"] = (df["Price"].fillna(df.groupby("Section")["Price"].transform("mean"))
生产
In [23]: df Out[23]: Name Sex Section Price 0 Joe M 1 2.0 1 Bob M 1 4.0 2 Nancy F 2 5.0 3 Grace F 1 6.0 4 Jen F 2 10.0 5 Paul M 2 7.5
这是有效的,因为我们可以通过Section计算平均值:
In [29]: df.groupby("Section")["Price"].mean() Out[29]: Section 1 4.0 2 7.5 Name: Price, dtype: float64
并将此广播回到一个完整的系列,我们可以使用transform
以下方法传递给fillna()
In [30]: df.groupby("Section")["Price"].transform("mean") Out[30]: 0 4.0 1 4.0 2 7.5 3 4.0 4 7.5 5 7.5 Name: Price, dtype: float64