我有一个DataFrame带有要映射的变量,使用的字典中的键不是“普通”字符串,而是正则表达式。
import pandas as pd
import re
df = pd.DataFrame({'cat': ['A1', 'A2', 'B1']})
我想做的是df['cat'].map({'A\d': 'a', 'B1': 'b'})
,但是A\d
似乎没有被解释为正则表达式。在这个简单的MWE中,我可以做df['cat'].map({'A1': 'a', 'A2': 'a', 'B1': 'b'})
,但是在现实世界中,正则表达式要复杂得多。此外,字典要复杂得多,因此the solution here(需要添加开始和结束语句并在键周围应用re.compile
)是不可行的。
答案 0 :(得分:4)
replace
与regex=True
一起使用 map
接受呼叫。当您通过字典时,它将用lambda x: your_dict.get(x, x)
替换字典。出于您的目的,replace
是合适的。
df.replace({'A\d': 'a', 'B1': 'b'}, regex=True)
cat
0 a
1 a
2 b
答案 1 :(得分:1)
我不确定您的字典有多复杂。但是,如果时间不太长,我们可以一一匹配并替换:
maps = {'A\d': 'a', 'B1': 'b'}
(pd.concat((df['cat'].str.match(k) for k in maps), axis=1, ignore_index=True)
.dot(pd.Series(d for k,d in maps.items()))
)
输出:
0 a
1 a
2 b
dtype: object