我正在尝试找出数据集中两列fill in之后的缺失值。groupby``planets
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 循环),问题仍然会出现。
titanic
# 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
这里出了什么问题?任何建议都值得感激。谢谢!
在你使用 groupby 和 transform 填充缺失值时,问题可能出在对某些组合的均值计算上,这导致仍然有一些缺失值未被填充。这种情况通常发生在以下几种情况下:
groupby
transform
某些组合的缺失值过多:例如,如果在某个特定的 method 和 year 组合中,所有的值都是缺失的,那么 x.mean() 就会返回 NaN,因此无法填充这些缺失值。
method
year
x.mean()
NaN
组的大小:如果某些组的大小太小(例如只有一个观测值),那么它们的均值可能无法计算。
为了解决这个问题,你可以使用 fillna 方法在计算均值时进行检查,以确保不填充那些结果为 NaN 的组。
fillna
下面是修正后的代码,可以帮助你确认填充的有效性:
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())
lambda
if not x.mean() is pd.NA
df.dropna(subset=[col], inplace=True)
通过这些步骤,你应该能够成功地填充缺失值。希望这能帮助你解决问题!如果还有其他问题,请随时问我。