Python 基于正则表达式字典填充数据帧列
我有一个如下所示的数据帧:Python 基于正则表达式字典填充数据帧列,python,pandas,dictionary,dataframe,Python,Pandas,Dictionary,Dataframe,我有一个如下所示的数据帧: GE GO 1 AD Weiss 2 KI Ruby 3 OH Port 4 ER Rose 5 KI Rose 6 JJ Weiss 7 OH 7UP 8 AD 7UP 9 OP Coke 10 JJ Stout 我试图根据columnGO的值再添加一列。我在考虑使用字典,但我需要使用正则表达式来识别真实案例中的部分匹配。例如: Dic={'Weiss|
GE GO
1 AD Weiss
2 KI Ruby
3 OH Port
4 ER Rose
5 KI Rose
6 JJ Weiss
7 OH 7UP
8 AD 7UP
9 OP Coke
10 JJ Stout
我试图根据columnGO
的值再添加一列。我在考虑使用字典,但我需要使用正则表达式来识别真实案例中的部分匹配。例如:
Dic={'Weiss|\wuby|Sto\w+':'Beer', 'Port|Rose':'Wine','\dUP|Coke':'Soda'}
这将给
GE GO OUT
1 AD Weiss Beer
2 KI Ruby Beer
3 OH Port Wine
4 ER Rose Wine
5 KI Rose Wine
6 JJ Weiss Beer
7 OH 7UP Soda
8 AD 7UP Soda
9 OP Coke Soda
10 JJ Stout Beer
lambda函数在这里工作吗?我怎样才能把它变成正则表达式呢?提前谢谢 一个选项是使用
re
模块,在GO
列上有map
:
import re
df['OUT'] = df.GO.map(lambda x: next(Dic[k] for k in Dic if re.search(k, x)))
df
如果没有任何模式与字符串匹配,则会引发错误。如果存在字符串与任何模式不匹配的情况,则可以编写自定义函数来捕获异常并返回None:
import re
def findCat(x):
try:
return next(Dic[k] for k in Dic if re.search(k, x))
except:
return None
df['OUT'] = df.GO.map(findCat)
df
您可以这样做:
In [253]: df['OUT'] = df[['GO']].replace({'GO':Dic}, regex=True)
In [254]: df
Out[254]:
GE GO OUT
1 AD Weiss Beer
2 KI Ruby Beer
3 OH Port Wine
4 ER Rose Wine
5 KI Rose Wine
6 JJ Weiss Beer
7 OH 7UP Soda
8 AD 7UP Soda
9 OP Coke Soda
10 JJ Stout Beer
有趣的观察-在较旧的熊猫版本中,Series.map()
方法几乎总是比DataFrame.replace()和Series.str.replace()方法更快。它在0.19.2中变得更好:
In [267]: df = pd.concat([df] * 10**4, ignore_index=True)
In [268]: %timeit df.GO.map(lambda x: next(Dic[k] for k in Dic if re.search(k, x)))
1 loop, best of 3: 1.57 s per loop
In [269]: %timeit df[['GO']].replace({'GO':Dic}, regex=True)
1 loop, best of 3: 895 ms per loop
In [270]: %timeit df.GO.replace(Dic, regex=True)
1 loop, best of 3: 876 ms per loop
In [271]: df.shape
Out[271]: (100000, 2)
啊。很好地使用了replace
。没有WAI!。。。非常棒的BTWdf.GO.replace(Dic,regex=True)
谢谢大家!我认为@Psidom的解决方案会更快…;-)当一个值与多个正则表达式匹配时会发生什么情况?@MaxU我很感激。。。但感觉太像你的答案了:-)这就是我所想的。。。但是还远远不够。@piRSquared显然,MaxU有更好的方法。我真的很惊讶-在以前的版本中DF.replace()
和Series.str.replace()
总是比熊猫0.19.2中的Series.map()
慢-对于30000行的DF来说,情况并非如此!这可能是由于映射
中使用了lambda,它还调用了正则表达式
匹配,这可能会减慢速度。