d_hsp={"1":"I","2":"II","3":"III","4":"IV","5":"V","6":"VI","7":"VII","8":"VIII",
"9":"IX","10":"X","11":"XI","12":"XII","13":"XIII","14":"XIV","15":"XV",
"16":"XVI","17":"XVII","18":"XVIII","19":"XIX","20":"XX","21":"XXI",
"22":"XXII","23":"XXIII","24":"XXIV","25":"XXV"}
HSP_OLD['tryl'] = HSP_OLD['tryl'].replace(d_hsp, regex=True)
HSP_OLD 是数据框,tryl 是HSP_OLD 的一列,下面是tryl 中的一些值示例>:
SAF/HSP:二级诊断E代码1
SAF/HSP:二级诊断 E 代码 11
我用字典来替换,它适用于 1-10,但是对于 11,它会变成“II”,对于 12,它会变成“III”。
请您参考如下方法:
抱歉,没有注意到您不仅要更新该字段,而且实际上还想在末尾替换一个数字,但即使是这种情况 - 将您的数字正确转换为罗马数字比将数字转换为罗马数字要好得多映射每个可能出现的情况(如果数字大于 25,您的代码会发生什么情况?)。所以,这是一种方法:
ROMAN_MAP = [(1000, 'M'), (900, 'CM'), (500, 'D'), (400, 'CD'), (100, 'C'), (90, 'XC'),
(50, 'L'), (40, 'XL'), (10, 'X'), (9, 'IX'), (5, 'V'), (4, 'IV'), (1, 'I')]
def romanize(data):
if not data or not isinstance(data, str): # we know how to work with strings only
return data
data = data.rstrip() # remove potential extra whitespace at the end
space_pos = data.rfind(" ") # find the last space before the number
if space_pos != -1:
try:
number = int(data[space_pos + 1:]) # get the number at the end
roman_number = ""
for i, r in ROMAN_MAP: # loop-reduce substitution based on the ROMAN_MAP
while number >= i:
roman_number += r
number -= i
return data[:space_pos + 1] + roman_number # put everything back together
except (TypeError, ValueError):
pass # couldn't extract a number
return data
现在,如果我们将您的数据框创建为:
HSP_OLD = pd.DataFrame({"tryl": ["SAF/HSP: Secondary diagnosis E code 1",
None,
"SAF/HSP: Secondary diagnosis E code 11",
"Something else without a number at the end"]})
我们无法轻松地将我们的函数应用于整个列:
HSP_OLD['tryl'] = HSP_OLD['tryl'].apply(romanize)
结果是:
tryl
0 SAF/HSP: Secondary diagnosis E code I
1 None
2 SAF/HSP: Secondary diagnosis E code XI
3 Something else without a number at the end
当然,您可以根据需要调整 romanize() 函数来搜索字符串中的任何数字并将其转换为罗马数字 - 这只是如何快速查找数字的示例在字符串的末尾。
