我有以下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
中的机会非常高。例如:
0 URBANA. OBRA NUEVA TERMINADA. Urbana
1 San Pedro número xxxxx
在这里,我正在寻找San Pedro
,但是San Pedro
和URBANA
都在_direcciones
中,所以这两行都是True
。我不知道如何解决这个问题。
答案 0 :(得分:2)
Series.str.contains
和str.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
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'
答案 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