我有一个pandas DataFrame.我试图根据Section栏中相应级别的平均价格填写价格列的nans.这样做有效而优雅的方法是什么?我的数据看起来像这样
Name Sex Section Price
Joe M 1 2
Bob M 1 nan
Nancy F 2 5
Grace F 1 6
Jen F 2 3
Paul M 2 nan
Run Code Online (Sandbox Code Playgroud)
你可以使用结合起来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
Run Code Online (Sandbox Code Playgroud)
我们可以用
df["Price"] = (df["Price"].fillna(df.groupby("Section")["Price"].transform("mean"))
Run Code Online (Sandbox Code Playgroud)
生产
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
Run Code Online (Sandbox Code Playgroud)
这是有效的,因为我们可以通过Section计算平均值:
In [29]: df.groupby("Section")["Price"].mean()
Out[29]:
Section
1 4.0
2 7.5
Name: Price, dtype: float64
Run Code Online (Sandbox Code Playgroud)
并将此广播回到一个完整的系列,我们可以使用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
Run Code Online (Sandbox Code Playgroud)