使用Pandas删除字符串中除了最后一个句点之外的所有句点:
s = pd.Series(['1.234.5','123.5','2.345.6','678.9'])
counts = s.str.count('\.')
target = counts==2
target
0 True
1 False
2 True
3 False
dtype: bool
s = s[target].str.replace('\.','',1)
s
0 1234.5
2 2345.6
dtype: object
我想要的输出是:
0 1234.5
1 123.5
2 2345.6
3 678.9
dtype: object
替换命令以及掩码目标似乎正在删除未替换的值,我看不出如何解决这个问题。
答案 0 :(得分:8)
选项1
这个带有str.replace
的正则表达式模式应该很好。
s.str.replace(r'\.(?=.*?\.)', '')
0 1234.5
1 123.5
2 2345.6
3 678.9
dtype: object
这个想法是,只要有更多的字符要替换,就不断更换。这是使用的正则表达式的细分 -
\. # '.'
(?= # positive lookahead
.*? # match anything
\. # look for '.'
)
选项2
如果你想使用count
来做这件事,那是不可能的,但这是一个挑战。您可以使用np.vectorize
轻松完成此操作。首先,定义一个函数 -
def foo(r, c):
return r.replace('.', '', c)
向量化它 -
v = np.vectorize(foo)
现在,调用函数v
,传递s
并计算要替换 -
pd.Series(v(s, s.str.count(r'\.') - 1))
0 1234.5
1 123.5
2 2345.6
3 678.9
dtype: object
请记住,这基本上是一个美化的循环。 python的等价物就像 -
r = []
for x, y in zip(s, s.str.count(r'\.') - 1):
r.append(x.replace('.', '', y))
pd.Series(r)
0 1234.5
1 123.5
2 2345.6
3 678.9
dtype: object
或者,使用列表理解 -
pd.Series([x.replace('.', '', y) for x, y in zip(s, s.str.count(r'\.') - 1)])
0 1234.5
1 123.5
2 2345.6
3 678.9
dtype: object
答案 1 :(得分:0)
您想要更换蒙面物品并保持其余部分不受影响。这正是Series.where
的作用,除了它取代了未屏蔽的值,因此你需要否定掩码。
s.where(~target, s.str.replace('\.','',1))
或者您可以通过分配屏蔽值来进行就地更改,这可能更便宜但更具破坏性。
s[target] = s[target].str.replace('\.','',1)