小能豆

使用 Groupby 填充缺失值

py

我正在尝试找出数据集中两列fill in之后的缺失值。groupby``planets

# Load data
df = sns.load_dataset('planets')

# Check naan
df.isna().sum()

method              0
number              0
orbital_period     43
mass              522
distance          227
year                0
dtype: int64

但是,在用组均值填充缺失值后,缺失值仍然存在。我不确定为什么会发生这种情况(我在数据集上尝试过titanic,它在那里完全有效)。即使我尝试按每列填充(没有 for 循环),问题仍然会出现。

# Select naan column names
null_cols = df.columns[df.isnull().any()]

# Fill in with loop
for col in null_cols:
  df[col] = df.groupby(['method', 'year'])[col].transform(lambda x: x.fillna(x.mean()))

# Check naan values again
df.isna().sum()

method              0
number              0
orbital_period     28
mass              405
distance           26
year                0

这里出了什么问题?任何建议都值得感激。谢谢!


阅读 26

收藏
2024-11-05

共1个答案

小能豆

在你使用 groupbytransform 填充缺失值时,问题可能出在对某些组合的均值计算上,这导致仍然有一些缺失值未被填充。这种情况通常发生在以下几种情况下:

  1. 某些组合的缺失值过多:例如,如果在某个特定的 methodyear 组合中,所有的值都是缺失的,那么 x.mean() 就会返回 NaN,因此无法填充这些缺失值。

  2. 组的大小:如果某些组的大小太小(例如只有一个观测值),那么它们的均值可能无法计算。

为了解决这个问题,你可以使用 fillna 方法在计算均值时进行检查,以确保不填充那些结果为 NaN 的组。

下面是修正后的代码,可以帮助你确认填充的有效性:

import pandas as pd
import seaborn as sns

# Load data
df = sns.load_dataset('planets')

# Check for NaN values
print(df.isna().sum())

# Select NaN column names
null_cols = df.columns[df.isnull().any()]

# Fill in with group means
for col in null_cols:
    # Use groupby and transform, but check if mean is NaN before filling
    df[col] = df.groupby(['method', 'year'])[col].transform(lambda x: x.fillna(x.mean()) if not x.mean() is pd.NA else x)

# Check NaN values again
print(df.isna().sum())

说明

  1. 检查均值:在 lambda 函数中,我们使用 if not x.mean() is pd.NA 来检查均值是否为 NaN,如果是,就不进行填充。
  2. 输出检查:在填充后再次输出缺失值的数量,以便确认填充是否有效。

其他建议

  • 你可以在填充之前使用 df.dropna(subset=[col], inplace=True) 先删除掉那些特定列的完全缺失的行,以确保在计算均值时能够有数据。
  • 你还可以考虑使用其他填充方法,例如使用中位数或众数,这可能更合适,尤其是在有许多异常值的情况下。

通过这些步骤,你应该能够成功地填充缺失值。希望这能帮助你解决问题!如果还有其他问题,请随时问我。

2024-11-05