繁体   English   中英

替换 dataframe 中列中的部分文本

[英]Replace part of text from column in dataframe

我需要替换以下

数字路线 字母数字路线
1571 T57A
2212 P21B
3123 A12C
421 E21
2473 P21C

我一直在 web 中搜索,现在我发现了以下内容

mapping = { 1:'T', 2:'P', 3:'A', 4:'E'}
for k, v in mapping.items():
    k = str(k)
    evaluate2['Alphanumeric Route'] = evaluate2['Numeric Route'].str.replace('^' + k + '{1}', v, case=False, regex=True)

通过这个我得到

数字路线 字母数字路线
1571 T571
2212 P212
3123 A123
421 E21
2473 P213

但是我仍然坚持最后一个字母,因为它取决于数字的 len 如果 len 为 3 则什么也不做,但如果 te len 为 4 则规则如下

mapping2 = { 1:'A', 2:'B', 3:'C', 4:'D', 5:'E'}

PS :对于第二部分,我尝试了以下但不起作用

for k, v in mapping2.items():
    k = str(k)
    evaluate2['Línea'] = evaluate2['Línea'].apply(lambda x: x if len(x) < 4 else x.replace(r'.*[' + k + ']$', v))

您可以使用正则表达式的后视实用程序:

import pandas as pd

evaluate2 = pd.DataFrame({'Numeric Route':['1571','2212','3123','421','2473']})

evaluate2['Alphanumeric Route'] = evaluate2['Numeric Route']

mapping = { 1:'T', 2:'P', 3:'A', 4:'E'}
mapping2 = { 1:'A', 2:'B', 3:'C', 4:'D', 5:'E'}

for k, v in mapping.items():
    k = str(k)
    evaluate2['Alphanumeric Route'] = evaluate2['Alphanumeric Route'].str.replace('^' + k + '{1}', v, 
            case=False, regex=True)

for k, v in mapping2.items():
    k = str(k)
    evaluate2['Alphanumeric Route'] = evaluate2['Alphanumeric Route'].str.replace('(?<=.{3})'+k+'$', v,
            case=False, regex=True)


print(evaluate2)

我使用相同的代码来执行这两个操作,只是更改了正则表达式部分。

(?<=...) : Look-behind 检查固定长度的正则表达式是否存在而不消耗或包含在主正则表达式中。

Output:

  Numeric Route Alphanumeric Route
0          1571               T57A
1          2212               P21B
2          3123               A12C
3           421                E21
4          2473               P47C

现在有更好的方法来做到这一点:

import pandas as pd

evaluate2 = pd.DataFrame({'Numeric Route':['1571','2212','3123','421','2473']})

mapping = { 1:'T', 2:'P', 3:'A', 4:'E'}
mapping2 = { 1:'A', 2:'B', 3:'C', 4:'D', 5:'E'}

N_mapping = {'^'+str(key):value for key,value in mapping.items()}
N_mapping2 = {'(?<=.{3})'+str(key)+'$':value for key,value in mapping.items()}

evaluate2['Alphanumeric Route'] = evaluate2['Numeric Route'].replace(N_mapping,regex=True)

evaluate2['Alphanumeric Route'] = evaluate2['Alphanumeric Route'].replace(N_mapping2,regex=True)


print(evaluate2)

Output:

(同上)

暂无
暂无

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM