熊猫:如何用groupby的平均值填充空值?

sfa*_*tor 9 python missing-data pandas imputation

我有一个数据集将丢失一些看起来像这样的数据:

id    category     value
1     A            NaN
2     B            NaN
3     A            10.5
4     C            NaN
5     A            2.0
6     B            1.0
Run Code Online (Sandbox Code Playgroud)

我需要填写空值来使用模型中的数据.每次类别第一次出现时,它都是NULL.我想要的方法是对类似的情况AB具有多个值的情况用该类别的平均值替换空值.对于C仅出现一次的类别,只需填写其余数据的平均值即可.

我知道我可以简单地执行此操作C以获得所有行的平均值,但我仍然试图为A和B执行分类方法并替换空值.

df['value'] = df['value'].fillna(df['value'].mean()) 
Run Code Online (Sandbox Code Playgroud)

我需要最终的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
Run Code Online (Sandbox Code Playgroud)

jez*_*ael 8

我想你可以使用groupbyapply fillna使用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
Run Code Online (Sandbox Code Playgroud)

  • @Mari - 使用 `df = df.groupby('category').apply(lambda x: x.fillna(x.mean())).reset_index(drop=True)` (3认同)

jpp*_*jpp 7

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

df['value'] = df['value'].fillna(df.groupby('category')['value'].transform('mean'))
df['value'] = df['value'].fillna(df['value'].mean())
Run Code Online (Sandbox Code Playgroud)

  • 感谢您的帮助,我正在尝试加快我的一些 ETL 工作流程,这很有效。 (2认同)