搜索DataFram中任何一行中包含的文本

2024-04-19 12:24:39 发布

您现在位置:Python中文网/ 问答频道 /正文

我有下面的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中存在一个单词的可能性非常高。例如:

pred公司

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

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


Tags: righttruedataframe地址contextdeoutsan
3条回答

尝试这种方法,似乎适用于我使用的小数据示例:

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

^{}&;^{}

您可以使用Series.str.contains并将_direcciones中的列作为一个字符串与|作为分隔符连接起来。你知道吗

同样需要注意的是,我们必须用str.upper将dataframe的字符串pred转换为大写

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

只获取T&;F

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'

对所有由|^{}和参数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

如有必要,添加^{}

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

相关问题 更多 >