搜索熊猫DataFrame的任何行中包含的文本

时间:2019-05-07 11:13:46

标签: python pandas dataframe

我有以下DataFrame

pred[['right_context', 'PERC']]
Out[247]: 
                          right_context      PERC
0  xxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxx  0.000197
1                San Pedro xxxxxxxxxxxx  0.572630
2          zxxxxxxxxxxxxxxxxxxxxxxxxxxx  0.572630
3             de San Pedro Este parcela  0.572630
4   xxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxx  0.035577

我还有另外一个叫DataFrame的熊猫,_direcciones的真实地址是:

388427          SAN PEDRO              1
388428     bbbbbbbbbbbbbbbbbbbbbb      1
388429        yyyyyyyyyyyyyyyyyyy      1
[388430 rows x 2 columns]

我需要以某种方式搜索第一个_direcciones中是否包含DataFrame 中的某个地址,我要做的是:

[True for y in pred.right_context 
   for x in _direcciones.entity_content 
   if re.match(r'^%s\b' %x, y, flags=re.I)]

但是它非常慢,而且,更重要的是,如果找到了地址,我想在第DataFrame列的后面附加值True|False,但是目前无法,因为上面的代码可以返回任意数量的行,不完全是5,就像我需要的第一个DataFrame一样。

类似这样的东西:

pred[['right_context', 'PERC']]
Out[247]: 
                          right_context      PERC    found?
0  xxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxx  0.000197       F
1                San Pedro xxxxxxxxxxxx  0.572630       T
2          zxxxxxxxxxxxxxxxxxxxxxxxxxxx  0.572630       F
3             de San Pedro Este parcela  0.572630       T
4   xxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxx  0.035577       F

更新

感谢您的回答,但我面临着同样的问题,_direcciones如此之大,以至于pred.right_context中存在一个单词在_direcciones中的机会非常高。例如:

pred

0    URBANA. OBRA NUEVA TERMINADA. Urbana
1                  San Pedro número xxxxx

在这里,我正在寻找San Pedro,但是San PedroURBANA都在_direcciones中,所以这两行都是True。我不知道如何解决这个问题。

3 个答案:

答案 0 :(得分:2)

Series.str.containsstr.upper

您不能使用Series.str.contains并以_direcciones作为分隔符将|中的列作为一个字符串连接。

还要注意,我们必须使用pred将数据帧str.upper的字符串转换为大写形式

pred['found?'] = pred['right_context'].str.upper()\
                                      .str.contains('|'.join(_direcciones['Address']))

print(pred)
                          right_context      PERC  found?
0  xxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxx  0.000197   False
1                San Pedro xxxxxxxxxxxx  0.572630    True
2          zxxxxxxxxxxxxxxxxxxxxxxxxxxx  0.572630   False
3             de San Pedro Este parcela  0.572630    True
4   xxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxx  0.035577   False

仅获得TF

pred['found?'] = pred['right_context'].str.upper()\
                                      .str.contains('|'.join(_direcciones['Address']))\
                                      .astype(str).str[:1]

print(pred)
                          right_context      PERC found?
0  xxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxx  0.000197      F
1                San Pedro xxxxxxxxxxxx  0.572630      T
2          zxxxxxxxxxxxxxxxxxxxxxxxxxxx  0.572630      F
3             de San Pedro Este parcela  0.572630      T
4   xxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxx  0.035577      F

'|'.join

的输出
'|'.join(_direcciones['Address'])

'SAN PEDRO|bbbbbbbbbbbbbbbbbbbbbb|yyyyyyyyyyyyyyyyyyy'

答案 1 :(得分:1)

对所有由|Series.str.contains和参数case=False连接的字符串使用单词边界:

pat = '|'.join(r"\b{}\b".format(x) for x in _direcciones['entity_content'])
pred['found?'] = pred['right_context'].str.contains(pat, case=False)
print (pred)
                          right_context      PERC  found?
0  xxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxx  0.000197   False
1                San Pedro xxxxxxxxxxxx  0.572630    True
2          zxxxxxxxxxxxxxxxxxxxxxxxxxxx  0.572630   False
3             de San Pedro Este parcela  0.572630    True
4   xxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxx  0.035577   False

如有必要,添加numpy.where

pat = '|'.join(r"\b{}\b".format(x) for x in _direcciones['entity_content'])
pred['found?'] = np.where(pred['right_context'].str.contains(pat, case=False), 'T', 'F')
print (pred)
                          right_context      PERC found?
0  xxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxx  0.000197      F
1                San Pedro xxxxxxxxxxxx  0.572630      T
2          zxxxxxxxxxxxxxxxxxxxxxxxxxxx  0.572630      F
3             de San Pedro Este parcela  0.572630      T
4   xxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxx  0.035577      F

答案 2 :(得分:1)

尝试这种方法,似乎可以使用少量数据样本为我工作:

from pprint import pprint
import numpy as np
import pandas as pd

def main():
    #Sample Data
    df_right = pd.DataFrame({'right_context':'San Jose, San Pedro, San Pedro Este, Santani, Honolulu'.split(','),
                       'PERC': np.arange(5)})
    directions = pd.DataFrame({'address':'SAN PEDRO, Djiloboji, Torres'.split(','),
                       'value': np.arange(3)})
    # generate found result
    found=(df_right['right_context'].str.contains('San Pedro', case=False)).tolist()
    # Insert into original dataframe
    df_right.insert(2,"found",found)
    pprint(df_right)

if __name__== "__main__":
    main()

输出:

     right_context  PERC  found
0         San Jose     0  False
1        San Pedro     1   True
2   San Pedro Este     2   True
3          Santani     3  False
4         Honolulu     4  False