从整个 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)
替换掉
您好,我想删除整个 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)
替换掉