3 回答
TA贡献1155条经验 获得超0个赞
如果您有大型数据集,我会尝试使用numpy.select
and pandas.str.contains
:
import numpy as np
import pandas as pd
df["NewCol"] = np.select(
condlist=[
df["InvestmentDesc"].str.contains("1st lien|first lien", case=False, na=False),
df["InvestmentDesc"].str.contains("2nd lien|second lien", case=False, na=False),
df["InvestmentDesc"].str.contains("term loan", case=False, na=False),
],
choicelist=[
"1l", "2l", "tl"
],
default=df["InvestmentDesc"]
)
TA贡献1921条经验 获得超9个赞
您的应用函数存在语法问题。您不是将单个文本和字典作为参数传递,而是InvestmentDesc
在应用程序中传递整个系列 ( ) 列。因此,该函数在使用 的调用期间失败lambda
。
必需的:
replace_all(dictReplace, text)
鉴于:
replace_all(dictRepStrings, df['InvestmentDesc'])
您可以自己解决这个问题,但为了可读性,我建议您进行一些小的更改。尝试将其与args
参数一起使用。
def replace_all(text, dictReplace): #Made dictReplace as second parameter
rep = dict((re.escape(k), v) for k, v in dictReplace.items())
pattern = re.compile("|".join(rep.keys()))
text = pattern.sub(lambda m: rep[re.escape(m.group(0))], text)
return text
dictRepStrings = {"1st lien": "1l", "first lien": "1l", "2nd lien": "2l", "second lien": "2l", "term loan": "tl"}
df['NewCol'] = df['InvestmentDesc'].apply(replace_all, args=[dictRepStrings]) #modified apply function with args
df
请注意,我通过删除更改了应用函数的结构lambda,添加了args参数并将其作为dict函数中的第二个参数,因此apply将每一行作为dict第一个参数传递,第二个参数定义在args
这对我有用,如果您仍然遇到问题,请告诉我。
TA贡献1811条经验 获得超6个赞
你也可以像这样做一些相对简单的事情:
def replacer(desc, replacers):
for key in replacers.keys():
if key in desc.lower():
desc = desc.lower().replace(key, replacers[key]).title()
return desc
replacers = {'1st lien': '1l', 'first lien': '1l', '2nd lien': '2l', 'second lien': '2l', 'term loan': 'tl'}
df['InvestmentDesc'].apply(replacer, replacers=replacers)
输出:
0 Four Seasons 1L Tl
1 Arden Group 1L Tl
2 Four Seasons 1L Tl
3 Arden 1L Tl
不确定大写是否重要,或者你可以稍微调整一下以获得你想要的大写。但我认为这是一个非常简单的解决方案,并且还将考虑每个字符串中的多个匹配项
也许可以针对不区分大小写的正则表达式搜索/替换修改它,但原理相同
添加回答
举报