Warning: file_get_contents(/data/phpspider/zhask/data//catemap/2/python/350.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Python 基于正则表达式字典填充数据帧列_Python_Pandas_Dictionary_Dataframe - Fatal编程技术网

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
我试图根据column
GO
的值再添加一列。我在考虑使用字典,但我需要使用正则表达式来识别真实案例中的部分匹配。例如:

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!。。。非常棒的BTW
df.GO.replace(Dic,regex=True)
谢谢大家!我认为@Psidom的解决方案会更快…;-)当一个值与多个正则表达式匹配时会发生什么情况?@MaxU我很感激。。。但感觉太像你的答案了:-)这就是我所想的。。。但是还远远不够。@piRSquared显然,MaxU有更好的方法。我真的很惊讶-在以前的版本中
DF.replace()
Series.str.replace()
总是比熊猫0.19.2中的
Series.map()
慢-对于30000行的DF来说,情况并非如此!这可能是由于
映射
中使用了lambda,它还调用了
正则表达式
匹配,这可能会减慢速度。