从整个 DataFrame 的字符串中删除尾随的 .0

Remove trailing .0 from strings of entire DataFrame

您好,我想删除整个 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 但由于某种原因它没有用(我读到可能是因为 replace 只替换整个字符串而不是子字符串?)。无论哪种方式,如果有一种方法可以工作,我很想听听它,因为它适用于我的数据框,但我觉得它不太正确,以防万一我会有像 .016.0 这样的值,因为它也会取代第一个2 个字符。

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

有没有在不遍历所有列的情况下执行此操作的方法?

谢谢!

让我们试试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)

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

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 在要删除的“列表”中。

有条件替换;使用 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)替换掉