【问题标题】:replace() method not working on Pandas DataFramereplace() 方法不适用于 Pandas DataFrame
【发布时间】:2016-10-02 06:58:33
【问题描述】:

我已经查看了这个问题,大多数问题都是针对更复杂的替换问题。但是在我的情况下,我有一个非常简单的数据框作为测试假人。

目的是用 nan 替换数据框中任何位置的字符串,但这似乎不起作用(即不替换;没有任何错误)。我试过用另一个字符串替换它也不起作用。例如

d = {'color' : pd.Series(['white', 'blue', 'orange']),
   'second_color': pd.Series(['white', 'black', 'blue']),
   'value' : pd.Series([1., 2., 3.])}
df = pd.DataFrame(d)
df.replace('white', np.nan)

输出还是:

      color second_color  value
  0   white        white      1
  1    blue        black      2
  2  orange         blue      3

【问题讨论】:

    标签: python pandas dataframe numpy replace


    【解决方案1】:

    对我有用的是使用这个 dict 表示法。

    {old_value:new_value}

    df.replace({10:100},inplace=True)
    

    查看文档以获取更多信息。 https://pandas.pydata.org/pandas-docs/version/0.23.4/generated/pandas.DataFrame.replace.html

    【讨论】:

      【解决方案2】:

      在直接使用替换功能之前,您可能需要检查列的数据类型。可能是您在 Object 数据类型上使用了 replace 函数,在这种情况下,您需要在将其转换为字符串后应用 replace 函数。

      Wrong:
      
      df["column-name"] = df["column-name"].replace('abc', 'def')
      
      Correct:
      
      df["column-name"] = df["column-name"].str.replace('abc', 'def')
      

      【讨论】:

        【解决方案3】:

        inplace=True 和regex=True 都不适用于我的情况。 所以我找到了一个使用Series.str.replace 的解决方案。如果您需要替换子字符串,它会很有用。

        In [4]: df['color'] = df.color.str.replace('e', 'E!')
        In [5]: df  
        Out[5]: 
             color second_color  value
        0   whitE!        white    1.0
        1    bluE!        black    2.0
        2  orangE!         blue    3.0
        

        甚至切片。

        In [10]: df.loc[df.color=='blue', 'color'] = df.color.str.replace('e', 'E!')
        In [11]: df  
        Out[11]: 
            color second_color  value
        0   white        white    1.0
        1   bluE!        black    2.0
        2  orange         blue    3.0
        

        【讨论】:

          【解决方案4】:

          鉴于这是搜索“Pandas replace is not working”时的最高 Google 结果,我还想提一下:

          replace 执行完全替换搜索,除非您打开正则表达式 转变。使用 regex=True,它应该执行部分替换 好吧。

          我花了 30 分钟才找到答案,所以希望我已经为下一个人节省了 30 分钟。

          【讨论】:

          • 正是我在分隔字符串内替换失败时遇到的问题。
          • 我也是这样。感谢分享!当我们开始使用替换功能时,这不是很清楚。
          • 哇,谢谢。我花了太长时间才找到这个
          • 非常感谢。 2021 年还在解决我的问题!
          • 是的,又节省了 30 分钟。谢谢!
          【解决方案5】:

          当您使用df.replace() 时,它会创建一个新的临时对象,但不会修改您的。您可以使用以下两行之一来修改 df:

          df = df.replace('white', np.nan)
          df.replace('white', np.nan, inplace = True)
          

          【讨论】:

            【解决方案6】:

            你需要分配回去

            df = df.replace('white', np.nan)
            

            或传递参数inplace=True:

            In [50]:
            d = {'color' : pd.Series(['white', 'blue', 'orange']),
               'second_color': pd.Series(['white', 'black', 'blue']),
               'value' : pd.Series([1., 2., 3.])}
            df = pd.DataFrame(d)
            df.replace('white', np.nan, inplace=True)
            df
            
            Out[50]:
                color second_color  value
            0     NaN          NaN    1.0
            1    blue        black    2.0
            2  orange         blue    3.0
            

            大多数 pandas 操作返回一个副本,并且大多数具有参数 inplace,通常默认为 False

            【讨论】:

            • 请注意,确实存在导致replace 在某些情况下无法正常工作的错误(请参阅问题#29813)。
            • 我刚刚遇到了一个问题,df.replace(x,y, inplace=True) 没有没有工作但df = df.replace(x,y)工作。 x 是 int64 和 y 是 float64
            • 与@MattR 相同。由于某种原因就地不工作
            • 啊-我遇到了类似的问题,其中 inplace=True 显然没有效果,而分配给新变量表明替换确实有效。我正在使用正则表达式来删除空格等。
            • 我相信 df.foo(x, y, inplace=True) 现在已被弃用,取而代之的是 df = df.foo(x, y)
            猜你喜欢
            • 2020-05-16
            • 1970-01-01
            • 2022-01-24
            • 2020-09-25
            • 2019-05-07
            相关资源
            最近更新 更多