Pandas替换多列不起作用

21 浏览
0 Comments

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中保留它们两个。谢谢!

0
0 Comments

问题: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提供的解答,这是最简洁的解决方法。用户通过重新赋值的方式修改了原对象的指定列,从而达到了期望的效果。

0
0 Comments

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类进行插补。如果只想对部分列进行插补,需要注意在插补后重新添加列名的问题。通过以上方法,可以有效地解决这个问题。

0