根据可变数据分布填充缺失的数据



我正在尝试创建一个for循环,以填充50多个变量中缺失的值。我应用的逻辑是,如果变量(cols(满足模式>中位数>均值或模式<中位数<均值(即偏斜(变量中缺失的值应该用变量的中值填充。如果模式=中值=平均值(即正态分布(,则变量缺失值应填充变量的平均值。如果变量不满足条件,则用中值填充变量中缺失的值。我收到以下错误:-'ValueError:序列的真值不明确。使用a.empty、a.bool((、a.item((、.any((或.all((。'

我对这个错误有一点了解,但不确定如何解决这个问题。我开始对熊猫使用if条件语句,但仍然出现了错误。我已将代码粘贴到下面。非常感谢您提前提供的帮助!

方法1

#filling data based on the variable distribution
for cols in num_cols2:
if ((df[cols].mean() < df[cols].median()) & (df[cols].median() < df[cols].mode())) | ((df[cols].mean() > df[cols].median()) & (df[cols].median() > df[cols].mode())):
df[cols]=df[cols].fillna(df.median())
elif ((df[cols].mean() == df[cols].median()) & (df[cols].median() == df[cols].mode())):
df[cols]=df[cols].fillna(df.mean().iloc[0])
else:
df[cols]=df[cols].fillna(df.median())

下方的错误消息

---------------------------------------------------------------------------
ValueError                                Traceback (most recent call last)
/Users/admin/Library/CloudStorage/OneDrive-Personal/DA Material/Data Science 6/EDAPipeDetectionleak.ipynb Cell 34 in <cell line: 3>()
1 #filling data based on distribution
3 for cols in num_cols2:
----> 4     if ((df[cols].mean() < df[cols].median()) & (df[cols].median() < df[cols].mode())) | ((df[cols].mean() > df[cols].median()) & (df[cols].median() > df[cols].mode())):
5         df[cols]=df[cols].fillna(df.median())
6     elif ((df[cols].mean() == df[cols].median()) & (df[cols].median() == df[cols].mode())):
File /opt/homebrew/lib/python3.10/site-packages/pandas/core/generic.py:1527, in NDFrame.__nonzero__(self)
1525 @final
1526 def __nonzero__(self):
-> 1527     raise ValueError(
1528         f"The truth value of a {type(self).__name__} is ambiguous. "
1529         "Use a.empty, a.bool(), a.item(), a.any() or a.all()."
1530     )
ValueError: The truth value of a Series is ambiguous. Use a.empty, a.bool(), a.item(), a.any() or a.all().

我还尝试了以下方法:-

进近2输出与上述相同的错误

for cols in num_cols2:
df[cols] = df[cols].apply(lambda cols:(df[cols].fillna(df.median()))) if (df[cols].mean() < df[cols].median()) & (df[cols].median() < df[cols].mode()) else (df[cols].fillna(df.mean()))

方法3

for cols in num_cols2:
df.loc[(df[cols].mean() < df[cols].median()) & (df[cols].median() < df[cols].mode())] = df[cols].fillna(df.median())
df.loc[df[cols].mean() > df[cols].median() & (df[cols].median() > df[cols].mode())] = df[cols].fillna(df.median())
df.loc[((df[cols].mean() == df[cols].median()) & (df[cols].median() == df[cols].mode()))] = df[cols].fillna(df.mean().iloc[0])
for cols in num_cols2:
df[cols] = df.loc[(df[cols].mean() < df[cols].median()) & (df[cols].median() < df[cols].mode())] = df[cols].fillna(df.median())
df[cols] = df.loc[df[cols].mean() > df[cols].median() & (df[cols].median() > df[cols].mode())] = df[cols].fillna(df.median())
df[cols] = df.loc[((df[cols].mean() == df[cols].median()) & (df[cols].median() == df[cols].mode()))] = df[cols].fillna(df.mean().iloc[0])

进近3的错误输出显示在下方

IndexingError: Unalignable boolean Series provided as indexer (index of the boolean Series and of the indexed object do not match).

因为使用标量使用andor,所以对于Series.mode返回第一个值:

for col in num_cols2:
avg = df[col].mean()
med = df[col].median()
mod = df[col].mode().iat[0]
if (avg == med) and (med == mod):
df[col]=df[col].fillna(avg)
else:
df[col]=df[col].fillna(med)

但由于avgmedian在上述if条件下相同,您可以通过用median:替换缺失值来简化解决方案

df[num_cols2] = df[num_cols2].fillna(df[num_cols2].median())

最新更新