繁体   English   中英

从整个 DataFrame 的字符串中删除 trailing.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

所需的 output:

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

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

然后我用正则表达式r'\.0$'尝试了 sub 和 rtrim ,但我也没有让它工作。 我不确定是因为正则表达式还是因为这些方法不适用于整个 dataframe。 同样使用带有.0的 rtrim 也不起作用,因为它也删除了之前没有点的零,然后 20 将变为 2。当尝试使用正则表达式的 sub 和 rtrim 时,我收到一个错误,即 dataframe 没有属性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)

如果列还不是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在要删除的“列表”中。

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

For those who are going to export the DataFrame to a CSV (or other types), you can use the parameter float_format from Pandas to eliminate all trailing zeros from the entire DataFrame.

df.to_csv(path_to_file.csv, float_format='%g')

'%g' 等格式解释

暂无
暂无

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM