Pandas替换多列不起作用
Pandas替换多列不起作用
我正在尝试访问Pima印第安人糖尿病数据集(在cols_missing中列出的那些列)的多个Pandas DataFrame列,并用np.NaN替换现有的零值。
# 在df中用NaN替换缺失值(无意义的0) cols_missing_vals = df[['Glucose','BloodPressure','SkinThickness','Insulin','BMI','Age']] df = cols_missing_vals.replace(to_replace=0, value=np.NaN, inplace=False) # 使用均值插补填充NaN值 df = df.fillna(value=df.mean(), inplace=False)
当我尝试使用inplace=False进行操作,以避免链式赋值和重新分配变量时,操作被执行,但那些没有进行替换操作的三列被删除。
Glucose BloodPressure SkinThickness Insulin BMI Age 0 148.0 72.0 35.00000 155.548223 33.6 50 1 85.0 66.0 29.00000 155.548223 26.6 31 2 183.0 64.0 29.15342 155.548223 23.3 32 3 89.0 66.0 23.00000 94.000000 28.1 21 4 137.0 40.0 35.00000 168.000000 43.1 33 ... ... ... ... ... ... ... 763 101.0 76.0 48.00000 180.000000 32.9 63 764 122.0 70.0 27.00000 155.548223 36.8 27 765 121.0 72.0 23.00000 112.000000 26.2 30 766 126.0 60.0 29.15342 155.548223 30.1 47 767 93.0 70.0 31.00000 155.548223 30.4 23
然而,一旦我使用inplace=True并跳过重新分配变量,根本没有进行替换操作。
cols_missing_vals = df[['Glucose','BloodPressure','SkinThickness','Insulin','BMI','Age']] cols_missing_vals.replace(to_replace=0, value=np.NaN, inplace=True) # 使用均值插补填充NaN值 df.fillna(value=df.mean(), inplace=True)
Pregnancies Glucose BloodPressure SkinThickness Insulin BMI DiabetesPedigreeFunction Age Outcome 0 6 148 72 35 0 33.6 0.627 50 1 1 1 85 66 29 0 26.6 0.351 31 0 2 8 183 64 0 0 23.3 0.672 32 1 3 1 89 66 23 94 28.1 0.167 21 0 4 0 137 40 35 168 43.1 2.288 33 1 ... ... ... ... ... ... ... ... ... ... 763 10 101 76 48 180 32.9 0.171 63 0 764 2 122 70 27 0 36.8 0.340 27 0 765 5 121 72 23 112 26.2 0.245 30 0 766 1 126 60 0 0 30.1 0.349 47 1 767 1 93 70 31 0 30.4 0.315 23 0
我该如何确保保留整个初始df,但对那些有用的列进行成功的均值插补?例如,虽然皮肤厚度不能为0并且表示缺失值,但怀孕次数为0完全可以接受,但我想在df中保留它们两个。谢谢!
问题:Pandas多列替换不起作用的原因和解决方法
在使用Pandas进行数据处理时,有时候需要对数据集中的多列进行替换操作。然而,有些用户在进行多列替换时遇到了问题,替换操作似乎没有起作用。下面将从一个用户提问的内容中整理出了该问题的出现原因和解决方法。
问题出现的原因是用户在替换操作时,使用了错误的方法。用户尝试了以下代码:
cols_missing_vals = ['Glucose','BloodPressure','SkinThickness','Insulin','BMI','Age'] df[cols_missing_vals] = df[cols_missing_vals].replace(to_replace=0, value=np.NaN) df[cols_missing_vals] = df[cols_missing_vals].fillna(value=df.mean())
用户原本希望将数据集中特定列中的值为0的元素替换为NaN,并使用每列的平均值填充NaN值。然而,该代码并没有达到用户的期望效果。
经过分析,问题出在第一行代码`df[cols_missing_vals] = df[cols_missing_vals].replace(to_replace=0, value=np.NaN)`中。这行代码实际上创建了一个新的DataFrame对象,并将其赋值给了原DataFrame对象的指定列。由于赋值操作只是将新对象的引用赋给了原对象的指定列,并没有改变原对象的值,所以最后一行代码`df[cols_missing_vals] = df[cols_missing_vals].fillna(value=df.mean())`并没有对原对象进行修改。
解决方法是将第一行代码修改为:
df.loc[:, cols_missing_vals] = df.loc[:, cols_missing_vals].replace(to_replace=0, value=np.NaN)
在这个修改后的代码中,使用了`loc`函数来同时选择多个列,并将替换后的结果赋值给原DataFrame对象的指定列。这样就能够正确地替换原对象中的特定列的值了。
感谢用户Ijdyer提供的解答,这是最简洁的解决方法。用户通过重新赋值的方式修改了原对象的指定列,从而达到了期望的效果。
Pandas中的replace方法用于替换DataFrame中的值,但在某些情况下可能会出现无法正常工作的问题。下面我们来分析出现这个问题的原因,并提供解决方法。
在上述代码中,我们使用了scikit-learn库中的SimpleImputer类来进行均值插补。首先,我们创建了一个示例DataFrame,并将其中的一些值设置为0,以模拟缺失值的情况。
然后,我们使用SimpleImputer来将0值进行插补。具体做法是创建一个SimpleImputer对象,将0设置为missing_values参数,将strategy参数设置为"mean",表示使用均值进行插补。然后,通过fit_transform方法将插补后的数据重新赋值给原始的DataFrame。
在这个例子中,插补成功,并且0值被均值所替代。
接下来,有人问到如果只想对部分列进行插补,该如何操作。可以使用以下代码来指定要进行插补的列:
cols_missing_vals = ['Glucose', 'BloodPressure', 'SkinThickness', 'Insulin', 'BMI', 'Age'] data = pd.DataFrame(data = impute_mean.fit_transform(data[cols_missing_vals]), columns = [cols_missing_vals])
在这段代码中,我们首先指定了要进行插补的列,然后使用fit_transform方法将插补后的数据重新赋值给原始的DataFrame,并通过columns参数指定列名。
然而,这段代码可能会出现问题,原因是SimpleImputer会移除列名。所以,我们需要在插补后的数据中重新添加列名,就像之前的示例中所做的那样:
data = pd.DataFrame(data = impute_mean.fit_transform(data), columns = columns)
这意味着在选择要插补的列时,需要考虑到这一点。
要解决Pandas中replace方法无法正常工作的问题,可以使用scikit-learn库中的SimpleImputer类进行插补。如果只想对部分列进行插补,需要注意在插补后重新添加列名的问题。通过以上方法,可以有效地解决这个问题。