Warning: file_get_contents(/data/phpspider/zhask/data//catemap/2/python/330.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Python 仅替换DataFrame中最后出现的列值_Python_Python 3.x_Pandas - Fatal编程技术网

Python 仅替换DataFrame中最后出现的列值

Python 仅替换DataFrame中最后出现的列值,python,python-3.x,pandas,Python,Python 3.x,Pandas,我有一个带有Company列的数据框 Company ------------------------------- Tundra Corporation Art Limited Desert Networks Incorporated Mount Yellowhive Security Corp Carter, Rath and Mueller Limited (USD/AC)

我有一个带有
Company
列的数据框

Company
-------------------------------                                                           
Tundra Corporation Art Limited
Desert Networks Incorporated
Mount Yellowhive Security Corp
Carter, Rath and Mueller Limited (USD/AC)
Barrows corporation /PACIFIC
Corporation, Mounted Security
我有一个带有正则表达式的字典,用于规范公司实体

(^|\s)corporation(\s|$); Corp 
(^|\s)Limited(\s|$); LTD 
(^|\s)Incorporated(\s|$); INC 
...
我只需要将最后一次事件正常化。这是我想要的输出

Company
-------------------------------                                                           
Tundra Corporation Art LTD
Desert Networks INC
Mount Yellowhive Security Corp
Carter, Rath and Mueller LTD (USD/AC)
Barrows Corp /PACIFIC
Corp, Mounted Security
(仅规范化
有限公司
公司
:苔原艺术有限公司)

我的代码:

for k, v in entity_dict.items():
    df['Company'].replace(regex=True, inplace=True, to_replace=re.compile(k,re.I), value=v)
是否可以只更改实体的最后一次出现(我是否需要更改正则表达式)

将字符串匹配结尾的
(\s |$)
更改为
($)

entity_dict = {'(^|\s)corporation($)': ' Corp',
               '(^|\s)Limited($)': ' LTD',
               '(^|\s)Incorporated($)': ' INC'}

for k, v in entity_dict.items():
    df['Company'].replace(regex=True, inplace=True, to_replace=re.compile(k,re.I), value=v)

print (df)
                          Company
0      Tundra Corporation Art LTD
1             Desert Networks INC
2  Mount Yellowhive Security Corp
编辑:您可以简化字典,不使用正则表达式,然后创建小写dict以供可能使用,获取索引的最后一个值
str[-1]
,并通过小写dict,在列表压缩中最后替换:

entity_dict = {'corporation': 'Corp',
               'Limited': 'LTD',
               'Incorporated': 'INC'}

lower = {k.lower():v for k, v in entity_dict.items()}
s1 = df['Company'].str.findall('|'.join(lower.keys()), flags=re.I).str[-1].fillna('')
s2 = s1.str.lower().map(lower).fillna('')

df['Company'] = [a.replace(b, c) for a, b, c in zip(df['Company'], s1, s2)]
print (df)
                                 Company
0             Tundra Corporation Art LTD
1                    Desert Networks INC
2         Mount Yellowhive Security Corp
3  Carter, Rath and Mueller LTD (USD/AC)
4                  Barrows Corp /PACIFIC
5                 Corp, Mounted Security

我不能这样做,因为有时它有点混乱,实体并不总是像您所期望的那样位于字符串的末尾。我试图清理数据。这就是为什么我只尝试将最后一次事件正常化。这给了我想要的结果now@JohnDoe-hmmm,是否可能更改样本数据?@JohnDoe-我现在很困惑,为什么只有第一个
Tundra Corporation
没有更改?@JohnDoe-所以如果需要多个匹配值,只更改最后一个?例如,如果
沙漠有限公司成立
则需要
沙漠有限公司成立
?@JohnDoe-因为
str.findall
-它通过dict匹配大小写值-这里使用相同的dict
s1=df['Company'].str.findall('124;').join(lower.keys()),flags=re.I).str[-1]。fillna(“”)
s1=df['Company'].str.findall('|').join(entity_dict.keys()),flags=re.I.str[-1]相同。fillna('')
,但对于
映射
来说必须精确匹配,因此使用
字典