【问题标题】:Dataframe's replace method behaving weird [duplicate]数据框的替换方法表现得很奇怪[重复]
【发布时间】:2021-11-12 05:25:31
【问题描述】:

我有一个数据集,想用 None 替换特定列的 0。

diabetes_data = pd.read_csv("https://raw.githubusercontent.com/npradaschnor/Pima-Indians-Diabetes-Dataset/master/diabetes.csv")
temp = diabetes_data.copy()
null_index = diabetes_data[diabetes_data["Glucose"]==0].index
print(diabetes_data.loc[null_index])

然后我使用replace方法,尝试用None替换0

temp["Glucose"] = diabetes_data["Glucose"].replace(0, None)
print(temp.loc[null_index])

在上图中可以看出这些值没有被None替换,我也不确定这些值是什么。

但是当我将参数作为列表传递给 replace 函数时,它会按预期工作。

temp1 = diabetes_data.copy()
temp1["Glucose"].replace([0], [None], inplace=True)
temp1.loc[null_index]

以上是我期望的输出。 replace 的文档说它也接受 int

所以我无法理解为什么在传递int 时会给出奇怪的结果?

【问题讨论】:

    标签: python pandas dataframe


    【解决方案1】:

    我们可以像这样使用numpy.nan,而不是用None替换0

    >>> import numpy as np
    >>> temp["Glucose"] = diabetes_data["Glucose"].replace(0, np.nan)
    >>> temp.loc[null_index]
            Pregnancies     Glucose     BloodPressure   SkinThickness   Insulin     BMI     DiabetesPedigreeFunction    Age     Outcome
    75      1               NaN         48              20              0           24.7    0.140                       22      0
    182     1               NaN         74              20              23          27.7    0.299                       21      0
    342     1               NaN         68              35              0           32.0    0.389                       22      0
    349     5               NaN         80              32              0           41.0    0.346                       37      1
    502     6               NaN         68              41              0           39.0    0.727                       41      1
    

    发生了什么:

    .replace 的前两个参数是 to_replacevalues这两个参数都默认为 None

    当您将None 作为第二个参数显式传递(即values)时,与完全不使用values 参数调用替换函数没有区别。如果没有传递任何进一步的参数,调用 .replace 将引用 method 参数:默认为 pad:在这种情况下,这可能是非常不受欢迎的效果。

    这意味着问题与您使用 int 的事实无关,而与您尝试替换 int 的值有关。

    来自pandas documentation的示例:

    这种情况实际上在文档中已明确解释,并提供了一种解决方法使用字典参数:

    比较 s.replace({'a': None}) 和 s.replace('a', None) 的行为,了解 to_replace 参数的特殊性:

    >>> s = pd.Series([10, 'a', 'a', 'b', 'a'])
    

    当使用 dict 作为 to_replace 值时,就好像 dict 中的值等于 value 参数。 s.replace({'a': None}) 等价于s.replace(to_replace={'a': None}, value=None, method=None)

    s.replace({'a': None})
    0      10
    1    None
    2    None
    3       b
    4    None
    dtype: object
    

    value=Noneto_replace 是标量、列表或元组时,replace 使用方法参数(默认为'pad')进行替换。所以这就是为什么在这种情况下,第 1 行和第 2 行中的“a”值被替换为 10,第 4 行中的“b”被替换。命令s.replace('a', None)实际上等价于s.replace(to_replace='a', value=None, method='pad')

    s.replace('a', None)
    0    10
    1    10
    2    10
    3     b
    4     b
    dtype: object
    

    【讨论】:

    • 我尝试了代码,正如@learnToCode 所说,它不起作用。使用np.nan 直接工作。是的,我试过了:),这个答案中显示的代码来自我这边。
    • 检查dupe,有需要OP的说明。
    • 是的好主意,我正在寻找它,因为我无法解释它。
    • @jezrael OP 看到的值是 ffill (pad) 值,来源:github.com/pandas-dev/pandas/blob/v1.3.3/pandas/core/…
    • @jezrael 正如你要求的那样,我确实转换了它,希望现在更好。
    猜你喜欢
    • 2017-04-16
    • 2016-07-17
    • 1970-01-01
    • 2013-02-12
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多