Sos*_*osi 3 python dictionary dataframe pandas
我有一个如下数据框:
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
Run Code Online (Sandbox Code Playgroud)
我正在尝试根据列的值添加一列GO.我正在考虑使用字典,但我需要使用正则表达式来识别我的实际案例中的部分匹配.例如:
Dic={'Weiss|\wuby|Sto\w+':'Beer', 'Port|Rose':'Wine','\dUP|Coke':'Soda'}
Run Code Online (Sandbox Code Playgroud)
这会给
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
Run Code Online (Sandbox Code Playgroud)
lambda函数在这里工作吗?我怎么把它变成正则表达式?提前致谢!
你可以这样做:
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
Run Code Online (Sandbox Code Playgroud)
相关观察 - 在较旧的Pandas版本中,与方法Series.map()相比,方法几乎总是更快.它在Pandas 0.19.2中变得更好:DataFrame.replace()Series.str.replace()
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)
Run Code Online (Sandbox Code Playgroud)
一种选择是使用列上re带有 a 的模块:mapGO
import re
df['OUT'] = df.GO.map(lambda x: next(Dic[k] for k in Dic if re.search(k, x)))
df
Run Code Online (Sandbox Code Playgroud)
如果没有任何模式与字符串匹配,则会引发错误。如果存在字符串与任何模式不匹配的情况,您可以编写自定义函数来捕获异常并返回 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
Run Code Online (Sandbox Code Playgroud)
| 归档时间: |
|
| 查看次数: |
948 次 |
| 最近记录: |