python replace string function抛出asterix通配符错误

时间:2015-09-17 15:00:45

标签: regex python-2.7 pandas wildcard

当我使用*时,我收到错误

raise error, v # invalid expression error: nothing to repeat

其他通配符如^可以正常工作。

代码行: df.columns = df.columns.str.replace('*agriculture', 'agri')

我正在使用pandas和python

编辑: 当我尝试使用/进行转义时,通配符不能正常工作

In[44]df = pd.DataFrame(columns=['agriculture', 'dfad agriculture df'])

In[45]df
Out[45]: 
Empty DataFrame
Columns: [agriculture, dfad agriculture df]
Index: []

in[46]df.columns.str.replace('/*agriculture*','agri')
Out[46]: Index([u'agri', u'dfad agri df'], dtype='object')

我认为通配符应输出Index([u'agri', u'agri'], dtype='object)

编辑: 我目前正在使用分层列,并且只想替换该特定级别的agri(级别= 2)。

原:

df.columns[0] = ('grand total', '2005', 'agriculture')
df.columns[1] = ('grand total', '2005', 'other')

期望的:

df.columns[0] = ('grand total', '2005', 'agri')
df.columns[1] = ('grand total', '2005', 'other')

我正在查看此链接:Changing columns names in Pandas with hierarchical columns

并且该作者说它将在0.15.0变得更容易,所以我希望有更新的更新解决方案

1 个答案:

答案 0 :(得分:2)

您需要在结尾处使用星号*才能将字符串匹配0次或更多次,请参阅docs

In [287]:
df = pd.DataFrame(columns=['agriculture'])
df

Out[287]:
Empty DataFrame
Columns: [agriculture]
Index: []

In [289]:
df.columns.str.replace('agriculture*', 'agri')

Out[289]:
Index(['agri'], dtype='object')

修改

根据您的新要求和实际要求,您可以使用str.contains查找匹配项,然后使用此列表构建dict以将旧名称映射到新名称,然后调用rename

In [307]:
matching_cols = df.columns[df.columns.str.contains('agriculture')]
df.rename(columns = dict(zip(matching_cols, ['agri'] * len(matching_cols))))

Out[307]:
Empty DataFrame
Columns: [agri, agri]
Index: []