使用匹配

时间:2016-02-12 14:51:31

标签: python regex python-2.7 pandas

我试图在Pandas系列中的索引中进行字符串替换。但是,目前它不匹配或找到子字符串并用给定值替换它。

我目前的系列:

index @12456 string_1 @54324 string_2 @34566 string_3 @57453 string_4 @67645 string_5 Name: value, dtype: object

对此,我正在尝试删除' @'从索引值中签名。

我正在使用:

series.replace(to_replace={'index': {'@': ''}})

然而,它似乎与子串匹配并返回初始系列。我错过了什么,我将如何达到预期的结果?

我的熊猫版目前为0.15。

P.S。我也尝试过:

series.replace(to_replace={'index': {r'@': ''}})
series.replace(to_replace={'index': {r'\@': ''}})

更新

有些答案正在解决具体问题,但我需要一个更一般的案例。所以,如果系列是:

index other_index @12456 1 string_1 @54324 2 string_2 @34566 3 string_3 @57453 4 string_4 @67645 5 string_5 Name: value, dtype: object

如何在此处对索引应用相同的操作?哪个适用于第一项措施和另一项措施?

1 个答案:

答案 0 :(得分:1)

您可以执行以下操作:

series.index = series.index.map(lambda v: v.replace('@', ''))

series.index = series.index.str.replace('@', '')

对于多索引,这是一个可能的解决方案(虽然不是很漂亮):

# setting up the indices and the series
arrays = [['@str1', '@str2'], [1, 2]]
ind = pd.MultiIndex.from_arrays(arrays, names=['index', 'other_index'])
series = pd.Series(['s1', 's2'], index=ind)

# index  other_index
# @str1  1              s1
# @str2  2              s2
# dtype: object

vals = zip(*series.index.get_values()) ## values of indices reshaped into a list of tuples
# [('@str1', '@str2'), (1L, 2L)]

# find out where is the index that we want to change
pos = series.index.names.index('index')
# now we can modify the tuple by replacing the strings we do not want
vals[pos] = tuple([x.replace('@', '') for x in vals[pos]])

# Re-create the multi-index
series.index = pd.MultiIndex.from_arrays(vals, names=series.index.names)

print series
# index  other_index
# str1   1              s1
# str2   2              s2
# dtype: object