Python Pandas数据框:用条件均值填充NaN值

12

我有以下数据框:

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填充基于“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

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

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个回答

7
我们希望将 "Cat" 值与缺失的 NaN 位置相关联。在 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

12
这段内容不值得单独回答,但df["Vals"].fillna(df.groupby("Cat")["Vals"].transform("mean"))可以避免需要改变索引的必要。它的意思是使用每个类别中"Vals"列的平均值填充该类别中缺失的值,而无需更改数据的索引。 - DSM
1
我想知道为什么你把 Cat 设置为索引?似乎 df['Vals'] = df['Vals'].fillna(means) 可以在不设置和重置索引的情况下产生相同的结果。 - Joe T. Boka
1
@JoeR:不会的,因为Cat取值为'A'和'B'。提问者想要用A(或B)对应的值的平均数来填充A(或B)的nan值。 - Kartik
@Kartik 只需运行代码,你就会看到结果是一样的。 - Joe T. Boka
@DSM,你的评论值得单独回答,非常有帮助! - charelf
显示剩余2条评论

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接