Regex python替换字符串函数抛出asterix通配符错误

Regex python替换字符串函数抛出asterix通配符错误,regex,python-2.7,pandas,wildcard,Regex,Python 2.7,Pandas,Wildcard,当我使用*时,我收到错误 引发错误,v#表达式无效 错误:无需重复 其他通配符,如^工作正常 代码行: df.columns=df.columns.str.replace('*agriculture','agri') 我正在使用熊猫和python 编辑: 当我尝试使用/进行转义时,通配符无法按我的预期工作 In[44]df = pd.DataFrame(columns=['agriculture', 'dfad agriculture df']) In[45]df Out[45]: Empt

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

引发错误,v#表达式无效
错误:无需重复

其他通配符,如
^
工作正常

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

我正在使用熊猫和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')
我认为通配符应该输出
索引([u'agri',u'agri'],dtype='object)


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

原件:

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')
我现在正在查看此链接:


这位作者说,在0.15.0版本会变得更容易,因此我希望有更多更新的解决方案

您需要在末尾添加星号
*
,以便将字符串匹配0次或更多次,请参见:

编辑

根据您的新要求和实际要求,您可以使用
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: []

谢谢你的信息。所以现在我没有收到错误,但是(如上面编辑中所解释的)通配符没有像我希望的那样工作。谢谢编辑。这很有道理,当我运行您的示例时,它是有效的。但是,当我使用数据帧运行它并添加
inplace=True
时,我得到了一个
keyerror
。然而,我认为这只是我的一部分。你会建议使用
inplace=True
,是吗?可能吧,但我没有你的真实数据和你的代码,但我认为上面的方法应该很好啊好吧,对不起,我本来没有说得更具体。我认为我遇到的问题是由于分层列。我会在上面更新。。我应该早点说明这一点。我不认为这会有什么不同。如果你有层次结构的列,那么你不能为给定级别重命名单个值,你必须使用setlevels为该级别的所有列传递一个值列表
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: []