我有以下数据框
Time.parse
我尝试了以下
time X Y X_t0 X_tp0 X_t1 X_tp1 X_t2 X_tp2
0 0.002876 0 10 0 NaN NaN NaN NaN NaN
1 0.002986 0 10 0 NaN 0 NaN NaN NaN
2 0.037367 1 10 1 1.000000 0 NaN 0 NaN
3 0.037374 2 10 2 0.500000 1 1.000000 0 NaN
4 0.037389 3 10 3 0.333333 2 0.500000 1 1.000000
5 0.037393 4 10 4 0.250000 3 0.333333 2 0.500000
....
1030308 9.962213 256 268 256 0.000000 256 0.003906 255 0.003922
1030309 10.041799 0 268 0 -inf 256 0.000000 256 0.003906
1030310 10.118960 0 268 0 NaN 0 -inf 256 0.000000
但是,每当我尝试拟合回归模型df.dropna(inplace=True)
X_train, X_test, y_train, y_test = train_test_split(X, y, test_size=0.40)
X_train = X_train.drop('time', axis=1)
X_train = X_train.drop('X_t1', axis=1)
X_train = X_train.drop('X_t2', axis=1)
X_test = X_test.drop('time', axis=1)
X_test = X_test.drop('X_t1', axis=1)
X_test = X_test.drop('X_t2', axis=1)
X_test.fillna(X_test.mean(), inplace=True)
X_train.fillna(X_train.mean(), inplace=True)
y_train.fillna(y_train.mean(), inplace=True)
时,我仍会收到此错误ValueError: Input contains NaN, infinity or a value too large for dtype('float32').
我们如何同时删除fit(X_train, y_train)
和NaN
值?
答案 0 :(得分:24)
使用pd.DataFrame.isin
并检查包含pd.DataFrame.any
的行。最后,使用布尔数组来切割数据帧。
df[~df.isin([np.nan, np.inf, -np.inf]).any(1)]
time X Y X_t0 X_tp0 X_t1 X_tp1 X_t2 X_tp2
4 0.037389 3 10 3 0.333333 2.0 0.500000 1.0 1.000000
5 0.037393 4 10 4 0.250000 3.0 0.333333 2.0 0.500000
1030308 9.962213 256 268 256 0.000000 256.0 0.003906 255.0 0.003922
答案 1 :(得分:14)
您可以将inf
和-inf
替换为NaN
,然后选择非空行。
df[df.replace([np.inf, -np.inf], np.nan).notnull().all(axis=1)] # .astype(np.float64) ?
或
df.replace([np.inf, -np.inf], np.nan).dropna(axis=1)
检查列返回的类型,确保它们符合预期(例如np.float32 / 64)df.info()
。
答案 2 :(得分:2)
与其删除包含任何null和无限数的行,不如将其逻辑相反,它更简洁,而是返回所有单元格均为有限数的行。 numpy isfinite函数会执行此操作,并且如果行中的 all 个单元格是有限的,则'.all(1)'将返回TRUE。
df = df[np.isfinite(df).all(1)]
答案 3 :(得分:1)
df.replace([np.inf, -np.inf], np.nan)
df.dropna(inplace=True)
答案 4 :(得分:0)
df.replace
仅替换该值上的第一个匹配项,从而替换错误
df = list(filter(lambda x: x!= inf, df))
将删除所有出现的inf
,然后可以使用drop
函数
答案 5 :(得分:0)
我更喜欢设置选项,以便将inf值计算为nan;
s1 = pd.Series([0, 1, 2])
s2 = pd.Series([2, 1, 0])
s1/s2
# Outputs:
# 0.0
# 1.0
# inf
# dtype: float64
pd.set_option('mode.use_inf_as_na', True)
s1/s2
# Outputs:
# 0.0
# 1.0
# NaN
# dtype: float64
请注意,您也可以使用上下文;
with pd.option_context('mode.use_inf_as_na', True):
print(s1/s2)
# Outputs:
# 0.0
# 1.0
# NaN
# dtype: float64