替换除数据帧中最后一个字符之外的所有字符

时间:2017-12-14 12:11:42

标签: python regex pandas

使用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

替换命令以及掩码目标似乎正在删除未替换的值,我看不出如何解决这个问题。

2 个答案:

答案 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)