Python pandas:如何删除nan和-inf值

时间:2017-08-17 21:16:58

标签: python python-3.x pandas numpy dataframe

我有以下数据框

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值?

6 个答案:

答案 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