我正在嘗試創建一個 for 回圈來填充 50 多個變數中的缺失值。我應用的邏輯是,如果變數(cols)滿足 mode>median>mean 或 mode<median<mean(即傾斜),則變數中的缺失值應該用變數的中位數填充。如果眾數=中值=均值(即正態分布),那么變數缺失值應該用變數的均值填充。如果變數則不滿足條件,則用中位數填充變數中的缺失值。我收到以下錯誤:-'ValueError:系列的真值不明確。使用 a.empty、a.bool()、a.item()、a.any() 或 a.all()。
我對錯誤有一點了解,但不確定如何解決問題。我開始采用對 pandas 使用 if 條件陳述句的方法,但仍然出現錯誤。我已經粘貼在我的代碼下面。非常感謝您提前提供的幫助!
方法一
#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).
uj5u.com熱心網友回復:
因為使用標量使用andor or, 用于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)
但是因為avg與上述條件相同median,if 您可以通過替換缺失值來簡化解決方案median:
df[num_cols2] = df[num_cols2].fillna(df[num_cols2].median())
轉載請註明出處,本文鏈接:https://www.uj5u.com/qukuanlian/512541.html
上一篇:如何使用For回圈計算和列印回圈內的總和?Python
下一篇:R中forloop中的函式
