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

时间:2015-10-31 22:13:50

标签: python pandas nan fill

我有以下数据框:

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

我希望索引56填充' Vals'的条件均值。基于“Cat'列,即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

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

df.Vals.fillna(df.Vals.mean(Conditionally to column 'Cat'))

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

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)

1 个答案:

答案 0 :(得分:4)

我们希望"关联"缺少NaN位置的Cat值。 在Pandas中,这种关联总是通过索引完成的。 因此,将Cat设置为索引是很自然的:

df = df.set_index(['Cat'])

完成后,fillna按预期工作:

df['Vals'] = df['Vals'].fillna(means)

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

df = df.reset_index()
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)

产量

  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