12

我有一个数据集,其中包含一些丢失的数据,如下所示:

id    category     value
1     A            NaN
2     B            NaN
3     A            10.5
4     C            NaN
5     A            2.0
6     B            1.0

我需要填写空值才能使用模型中的数据。每当一个类别第一次出现时,它都是 NULL。我想要做的方式是对于像类别这样的情况A,并且B具有多个值,用该类别的平均值替换空值。对于仅出现一次的类别C,只需填写其余数据的平均值。

我知道我可以简单地执行此操作C来获取所有行的平均值,但我坚持尝试对 A 和 B 进行分类均值并替换空值。

df['value'] = df['value'].fillna(df['value'].mean()) 

我需要最终的df是这样的

id    category     value
1     A            6.25
2     B            1.0
3     A            10.5
4     C            4.15
5     A            2.0
6     B            1.0
4

2 回答 2

12

我认为您可以使用groupbyand apply fillnawith mean。然后获取NaN某个类别是否只有NaN值,因此使用mean列的所有值进行填充NaN

df.value = df.groupby('category')['value'].apply(lambda x: x.fillna(x.mean()))
df.value = df.value.fillna(df.value.mean())
print (df)
   id category  value
0   1        A   6.25
1   2        B   1.00
2   3        A  10.50
3   4        C   4.15
4   5        A   2.00
5   6        B   1.00
于 2016-10-28T06:15:17.837 回答
8

您还可以使用GroupBy+transform以分组方式填充NaN值。这种方法避免了低效的apply+ lambda。例如:

df['value'] = df['value'].fillna(df.groupby('category')['value'].transform('mean'))
df['value'] = df['value'].fillna(df['value'].mean())
于 2018-08-10T00:15:47.797 回答