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: []