python pandas dataframe:用条件均值填充nans

Nio*_*urf 8 python nan fill pandas

我有以下数据帧:

import numpy as np 
import pandas as pd
df = pd.DataFrame(data={'Cat' : ['A', 'A', 'A','B', 'B', 'A', 'B'],
                        'Vals' : [1, 2, 3, 4, 5, np.nan, np.nan]})

    Cat   Vals
0   A     1
1   A     2
2   A     3
3   B     4
4   B     5
5   A   NaN
6   B   NaN
Run Code Online (Sandbox Code Playgroud)

我想要索引56填充基于'Cat'列的'Vals'的条件均值,即24.5

以下代码工作正常:

means = df.groupby('Cat').Vals.mean()
for i in df[df.Vals.isnull()].index:
    df.loc[i, 'Vals'] = means[df.loc[i].Cat]

    Cat   Vals
0   A     1
1   A     2
2   A     3
3   B     4
4   B     5
5   A     2
6   B   4.5
Run Code Online (Sandbox Code Playgroud)

但我正在寻找更好的东西,比如

df.Vals.fillna(df.Vals.mean(Conditionally to column 'Cat'))
Run Code Online (Sandbox Code Playgroud)

编辑:我发现这个,这是一行更短,但我仍然不满意它:

means = df.groupby('Cat').Vals.mean()
df.Vals = df.apply(lambda x: means[x.Cat] if pd.isnull(x.Vals) else x.Vals, axis=1)
Run Code Online (Sandbox Code Playgroud)

unu*_*tbu 5

我们希望将Cat值与缺失的NaN位置“关联” 。在熊猫中,此类关联始终通过索引进行。因此很自然地将其设置Cat为索引:

df = df.set_index(['Cat'])
Run Code Online (Sandbox Code Playgroud)

完成此操作后,即可fillna根据需要工作:

df['Vals'] = df['Vals'].fillna(means)
Run Code Online (Sandbox Code Playgroud)

要返回Cat到列,您当然可以使用reset_index

df = df.reset_index()
Run Code Online (Sandbox Code Playgroud)
import pandas as pd
import numpy as np
df = pd.DataFrame(
    {'Cat' : ['A', 'A', 'A','B', 'B', 'A', 'B'], 
     'Vals' : [1, 2, 3, 4, 5, np.nan, np.nan]})

means = df.groupby(['Cat'])['Vals'].mean()
df = df.set_index(['Cat'])
df['Vals'] = df['Vals'].fillna(means)
df = df.reset_index()
print(df)
Run Code Online (Sandbox Code Playgroud)

产量

  Cat  Vals
0   A   1.0
1   A   2.0
2   A   3.0
3   B   4.0
4   B   5.0
5   A   2.0
6   B   4.5
Run Code Online (Sandbox Code Playgroud)

  • 不值得单独回答,但是`df [“ Vals”]。fillna(df.groupby(“ Cat”)[“ Vals”]。transform(“ mean”)))可以避免更改索引。 (6认同)