根据另一列的平均值填充列的值

jak*_*kko 2 python pandas

我有一个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)

DSM*_*DSM 5

你可以使用结合起来groupby,transformmean.请注意,我已经修改了您的示例,因为否则两个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)