【问题标题】:Remove trailing .0 from strings of entire DataFrame从整个 DataFrame 的字符串中删除尾随 .0
【发布时间】:2021-09-22 02:19:37
【问题描述】:

您好,我想删除整个 DataFrame 字符串末尾的所有“.0”,我需要它完全匹配。

让我们做一个例子 df:

a      b      c
20     39.0   17-50
34.0   .016.0   001-6784532

想要的输出:

a      b      c
20     39     17-50
34     .016   001-6784532

我尝试使用replace,但由于某种原因它不起作用(我读到可能是因为替换只替换整个字符串而不是子字符串?)。无论哪种方式,如果有一种方法可以工作,我很想知道它,因为它适用于我的数据框,但我觉得它不太正确,以防万一我有像 .016.0 这样的值,因为它也会取代第一个2 个字符。

然后我用正则表达式r'\.0$' 尝试了 sub 和 rtrim,但我也没有让它工作。我不确定是因为正则表达式还是因为这些方法不适用于整个数据帧。同样将 rtrim 与 .0 一起使用也不起作用,因为它还删除了之前没有点的零,然后 20 将变为 2。 使用正则表达式尝试 sub 和 rtrim 时,我收到一个错误,即数据框没有属性 str,这怎么可能?

有没有办法在不遍历所有列的情况下做到这一点?

谢谢!

【问题讨论】:

    标签: python pandas string regexp-replace character-trimming


    【解决方案1】:

    我们试试DataFrame.replace:

    import pandas as pd
    
    df = pd.DataFrame({
        'a': ['20', '34.0'],
        'b': ['39.0', '.016.0'],
        'c': ['17-50', '001-6784532']
    })
    
    df = df.replace(r'\.0$', '', regex=True)
    
    print(df)
    

    如果列还没有str,则可选DataFrame.astype:

    df = df.astype(str).replace(r'\.0$', '', regex=True)
    

    之前:

          a       b            c
    0    20    39.0        17-50
    1  34.0  .016.0  001-6784532
    

    之后:

        a     b            c
    0  20    39        17-50
    1  34  .016  001-6784532
    

    rtrim/rstrip 在这里不起作用,因为它们不解析正则表达式,而是获取要删除的字符列表。因此,他们将删除所有0,因为0 在要删除的“列表”中。

    【讨论】:

      【解决方案2】:

      有条件地替换;使用 np.where()。

      df['b']=np.where(df['b'].str.contains('\.\d+\.'),df['b'].str.replace(r'\.\d+$','', regex=True), df['b'])
      
      
      
          a     b            c
      0  20.0  39.0        17-50
      1  34.0  .016  001-6784532
      

      也就是说,我们有.digit(s).的地方,把.\digit(s)放在最后

      【讨论】:

      • 感谢您的回复。我不明白这如何解决我的问题。它仍然在数据框的其余部分之后为您提供 .0,甚至在第一行的 b 列本身中。最后一句话是什么意思?我看到您的答案中没有使用它。谢谢!
      猜你喜欢
      • 2012-11-03
      • 2011-10-04
      • 1970-01-01
      • 2018-06-05
      • 2015-04-03
      • 2011-08-12
      • 1970-01-01
      • 1970-01-01
      相关资源
      最近更新 更多