[英]Fill In Missing Values With Groupby
我正在嘗試在planets
數據集的兩列groupby
后fill in
缺失值。
# 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
這里有什么問題? 任何建議,將不勝感激。 謝謝!
這可能會做你想要的。 使用DataFrame.fillna選擇平均值作為填充符:
df = sns.load_dataset('planets')
df = df.groupby(['method', 'year']).fillna(df.mean())
df.isna().sum()
df.head()
發生這種情況的原因是您生成的某些組的所有值都沒有一個非 nan 值。
取該組的值/列mass
('Microlensing', 2012)
,它有 6 個條目,其中有 0 個非 nan 值。 如果沒有實際值取平均值,則無法真正計算出可用於估算同一組中其他 nan 值的平均值。
這是我使用的調試代碼:
import math
import seaborn as sns
df = sns.load_dataset("planets")
print(df.isna().sum())
null_cols = df.columns[df.isnull().any()]
def inspect_fillna(x):
mean_x = x.mean()
if math.isnan(mean_x):
print("group=", x.name, ", entries=", len(x), ", all_are_nan=", len(x) == x.isna().sum(), sep="")
imputed_x = x.fillna(mean_x)
return imputed_x
for col in null_cols:
print("\n\ncol=", col, sep="")
df[col] = df.groupby(["method", "year"])[col].transform(lambda x: inspect_fillna(x))
print(df.isna().sum())
這是 output:
method 0
number 0
orbital_period 43
mass 522
distance 227
year 0
dtype: int64
col=orbital_period
group=('Imaging', 2004), entries=3, all_are_nan=True
group=('Imaging', 2005), entries=1, all_are_nan=True
group=('Imaging', 2007), entries=1, all_are_nan=True
group=('Imaging', 2012), entries=2, all_are_nan=True
group=('Imaging', 2013), entries=7, all_are_nan=True
group=('Microlensing', 2004), entries=1, all_are_nan=True
group=('Microlensing', 2009), entries=2, all_are_nan=True
group=('Microlensing', 2012), entries=6, all_are_nan=True
group=('Microlensing', 2013), entries=4, all_are_nan=True
group=('Transit Timing Variations', 2014), entries=1, all_are_nan=True
col=mass
group=('Astrometry', 2010), entries=1, all_are_nan=True
group=('Astrometry', 2013), entries=1, all_are_nan=True
group=('Eclipse Timing Variations', 2008), entries=2, all_are_nan=True
group=('Eclipse Timing Variations', 2010), entries=2, all_are_nan=True
group=('Eclipse Timing Variations', 2011), entries=3, all_are_nan=True
group=('Imaging', 2004), entries=3, all_are_nan=True
group=('Imaging', 2005), entries=1, all_are_nan=True
group=('Imaging', 2006), entries=4, all_are_nan=True
group=('Imaging', 2007), entries=1, all_are_nan=True
group=('Imaging', 2008), entries=8, all_are_nan=True
group=('Imaging', 2009), entries=3, all_are_nan=True
group=('Imaging', 2010), entries=6, all_are_nan=True
group=('Imaging', 2011), entries=3, all_are_nan=True
group=('Imaging', 2012), entries=2, all_are_nan=True
group=('Imaging', 2013), entries=7, all_are_nan=True
group=('Microlensing', 2004), entries=1, all_are_nan=True
group=('Microlensing', 2005), entries=2, all_are_nan=True
group=('Microlensing', 2006), entries=1, all_are_nan=True
group=('Microlensing', 2008), entries=4, all_are_nan=True
group=('Microlensing', 2009), entries=2, all_are_nan=True
group=('Microlensing', 2010), entries=2, all_are_nan=True
group=('Microlensing', 2011), entries=1, all_are_nan=True
group=('Microlensing', 2012), entries=6, all_are_nan=True
group=('Microlensing', 2013), entries=4, all_are_nan=True
group=('Orbital Brightness Modulation', 2011), entries=2, all_are_nan=True
group=('Orbital Brightness Modulation', 2013), entries=1, all_are_nan=True
group=('Pulsar Timing', 1992), entries=2, all_are_nan=True
group=('Pulsar Timing', 1994), entries=1, all_are_nan=True
group=('Pulsar Timing', 2003), entries=1, all_are_nan=True
group=('Pulsar Timing', 2011), entries=1, all_are_nan=True
group=('Pulsation Timing Variations', 2007), entries=1, all_are_nan=True
group=('Transit', 2002), entries=1, all_are_nan=True
group=('Transit', 2004), entries=5, all_are_nan=True
group=('Transit', 2006), entries=5, all_are_nan=True
group=('Transit', 2007), entries=16, all_are_nan=True
group=('Transit', 2008), entries=17, all_are_nan=True
group=('Transit', 2009), entries=18, all_are_nan=True
group=('Transit', 2010), entries=48, all_are_nan=True
group=('Transit', 2011), entries=80, all_are_nan=True
group=('Transit', 2012), entries=92, all_are_nan=True
group=('Transit', 2014), entries=40, all_are_nan=True
group=('Transit Timing Variations', 2011), entries=1, all_are_nan=True
group=('Transit Timing Variations', 2012), entries=1, all_are_nan=True
group=('Transit Timing Variations', 2013), entries=1, all_are_nan=True
group=('Transit Timing Variations', 2014), entries=1, all_are_nan=True
col=distance
group=('Eclipse Timing Variations', 2009), entries=1, all_are_nan=True
group=('Eclipse Timing Variations', 2011), entries=3, all_are_nan=True
group=('Eclipse Timing Variations', 2012), entries=1, all_are_nan=True
group=('Microlensing', 2004), entries=1, all_are_nan=True
group=('Microlensing', 2005), entries=2, all_are_nan=True
group=('Microlensing', 2006), entries=1, all_are_nan=True
group=('Microlensing', 2008), entries=4, all_are_nan=True
group=('Microlensing', 2009), entries=2, all_are_nan=True
group=('Microlensing', 2010), entries=2, all_are_nan=True
group=('Microlensing', 2011), entries=1, all_are_nan=True
group=('Orbital Brightness Modulation', 2013), entries=1, all_are_nan=True
group=('Pulsar Timing', 1992), entries=2, all_are_nan=True
group=('Pulsar Timing', 1994), entries=1, all_are_nan=True
group=('Pulsar Timing', 2003), entries=1, all_are_nan=True
group=('Pulsation Timing Variations', 2007), entries=1, all_are_nan=True
group=('Transit', 2002), entries=1, all_are_nan=True
group=('Transit Timing Variations', 2014), entries=1, all_are_nan=True
method 0
number 0
orbital_period 28
mass 405
distance 26
year 0
dtype: int64
可能的解決方案:考慮通過從組中刪除year
或method
來擴大您的組。
嘗試這個:
df.fillna(df.groupby(['method', 'year'])[col].transform('mean'))
聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.