在尝试匹配两个数据帧中的两个特定字时,我遇到了一些性能问题。我需要为包含单词的每一行返回1,否则返回0.我编写的函数如下所示:
def matchWords(row):
row = row[0].upper()
for x in df_X.Names:
if re.search("\\b" + x + "\\b", row):
return 1
return 0
这个函数是从lambda调用的,虽然它工作正常,但运行需要很长时间。我已经应用多线程以提高速度,但我希望它更快。有没有办法可以预编译df_X.Names
或者是否有人有另一个提示来更快/更有效?
提前感谢您的帮助!
答案 0 :(得分:0)
您需要的{IIUC} str.contains
,join
(|
)可以or
多个字。上次使用numpy.where
:
import pandas as pd
import numpy as np
df1 = pd.DataFrame({'d': {0: 'wa', 1: 'rs', 2: 'qn'},
'e': {0: 'i', 1: 'r', 2: 't'},
'f': {0: 'a', 1: 's', 2: 'f'}})
print df1
d e f
0 wa i a
1 rs r s
2 qn t f
df = pd.DataFrame({'a': {0: 'wa ug dh', 1: 'rs sd qn', 2: 'ga mf rn'},
'c': {0: 'i', 1: 'r', 2: 't'},
'b': {0: 'a', 1: 's', 2: 'f'}})
print df
a b c
0 wa ug dh a i
1 rs sd qn s r
2 ga mf rn f t
将d
列中的值加入分隔符|
:
words = "|".join(df1.d.tolist())
print words
wa|rs|qn
print df.a.str.contains(words)
0 True
1 True
2 False
Name: a, dtype: bool
print np.where(df.a.str.contains(words), 1, 0)
[1 1 0]
df['new'] = np.where(df.a.str.contains(words), 1, 0)
print df
a b c new
0 wa ug dh a i 1
1 rs sd qn s r 1
2 ga mf rn f t 0