我有以下形式的大型数据框:
FundManager | AsOfDate | InvestmentDesc | Amount
ManagerA | 6/1/2020 | Four Seasons 1st lien TL | 25500.86
ManagerA | 6/1/2020 | Arden Group First Lien TL | 28731.00
ManagerB | 6/1/2020 | Four Seasons 1L Term Loan | 16853.00
ManagerB | 6/1/2020 | Arden 1st Lien Term Loan | 50254.30
相同的基础金融工具通常由多个资产管理人持有,但描述方式略有不同,如上表所示(例如“四季 1st 留置权 TL”与“四季 1L 定期贷款”)。
我正在尝试找出对 pandas 数据框中的“InvestmentDesc”列进行某些替换的最佳方法(例如,将“Term Loan”替换为“TL”,将“1st Lien”替换为“1L”),理想情况下(i)以一种不必为每个术语重复遍历数百万行的方式,以及 (ii) 可以在数据框中的少数其他列上使用但使用单独的术语列表进行替换的方式。
我目前有以下功能:
def replace_all(dictReplace, text):
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(lambda x: replace_all(dictRepStrings, df['InvestmentDesc']))
df
然而,在这样做时,我最终得到“TypeError: expected string or bytes-like object”,如下所示:
---------------------------------------------------------------------------
TypeError Traceback (most recent call last)
<ipython-input-10-a37630bdc5a4> in <module>
23
24 dictRepStrings = {"1st lien": "1l", "first lien": "1l", "2nd lien": "2l", "second lien": "2l", "term loan": "tl"}
---> 25 df['NewCol'] = df['InvestmentDesc'].apply(lambda x: replace_all(dictRepStrings, df['InvestmentDesc']))
26 df
~\anaconda3\lib\site-packages\pandas\core\series.py in apply(self, func, convert_dtype, args, **kwds)
3846 else:
3847 values = self.astype(object).values
-> 3848 mapped = lib.map_infer(values, f, convert=convert_dtype)
3849
3850 if len(mapped) and isinstance(mapped[0], Series):
经过两天的谷歌搜索直到沮丧,我根本无法弄清楚我做错了什么或如何解决。任何关于我应该如何进行的建议或想法将不胜感激!
白衣非少年
郎朗坤
杨魅力
相关分类