我有两个超过一百万个名称的列表,命名约定略有不同.这里的目标是匹配那些相似的记录,具有95%置信度的逻辑.
我知道有一些我可以利用的库,比如Python中的FuzzyWuzzy模块.
然而,就处理而言,似乎将占用太多资源,将1个列表中的每个字符串与另一个列表进行比较,在这种情况下,似乎需要100万乘以另外的百万次迭代次数.
这个问题还有其他更有效的方法吗?
更新:
所以我创建了一个bucketing函数,并应用了一个简单的规范化,即删除空格,符号并将值转换为小写等...
for n in list(dftest['YM'].unique()):
n = str(n)
frame = dftest['Name'][dftest['YM'] == n]
print len(frame)
print n
for names in tqdm(frame):
closest = process.extractOne(names,frame)
Run Code Online (Sandbox Code Playgroud)
通过使用pythons pandas,将数据加载到按年分组的较小桶中,然后使用FuzzyWuzzy模块,process.extractOne用于获得最佳匹配.
结果仍然有点令人失望.在测试期间,上面的代码用于仅包含5千个名称的测试数据框,并且占用将近一个小时.
测试数据被拆分.
我正在用他们的YM在同一桶中的桶进行比较.
问题可能是因为我使用的FuzzyWuzzy模块?感谢任何帮助.
我创建了一个名为imagescraper的环境,并用它安装了pip.
然后我继续使用pip来安装一个名为ImageScraper的包;
>>activate imagescraper
[imagescraper]>>pip install ImageScraper
Run Code Online (Sandbox Code Playgroud)
只是为了确保我已成功安装包:
>>conda list
[imagescraper] C:\Users\John>conda list
# packages in environment at C:\Anaconda2\envs\imagescrap
#
future 0.15.2 <pip>
imagescraper 2.0.7 <pip>
lxml 3.6.0 <pip>
numpy 1.11.0 <pip>
pandas 0.18.0 <pip>
pip 8.1.1 py27_1
python 2.7.11 4
python-dateutil 2.5.2 <pip>
pytz 2016.3 <pip>
requests 2.9.1 <pip>
setproctitle 1.1.9 <pip>
setuptools 20.3 py27_0
simplepool 0.1 <pip>
six 1.10.0 <pip>
vs2008_runtime 9.00.30729.1 0
wheel 0.29.0 py27_0
Run Code Online (Sandbox Code Playgroud)
在我推出Jupyter笔记本之前,只需检查我们从哪里获取路径:
[imagescraper] C:\Users\John>python
Python 2.7.11 |Continuum Analytics, Inc.| (default, Feb 16 2016, …Run Code Online (Sandbox Code Playgroud) 我在这里有点困惑,在撰写本文时,最新的Anaconda发行版2018.12带有安装Microsoft Visual Studio Code的选项,这很棒。
在启动VSC以及Python: Select Interpreter安装Anaconda并进行全新安装之后,可以看到~Anaconda3\python.exe我所假定的是Anaconda Python Environment,但是,当我尝试运行一些命令时,我得到了:
PS ~\Documents\Python Scripts\vs> ~/Anaconda3/Scripts/activate
PS ~\Documents\Python Scripts\vs> conda activate base
Run Code Online (Sandbox Code Playgroud)
conda:术语'conda'不被视为cmdlet,函数,脚本文件或可运行程序的名称。检查名称的拼写,或者是否包含路径,请验证路径是否正确,然后重试。在第1行:char:1
现在,我知道它可能与环境变量有关,但是我发现它非常奇怪,因为在安装Anaconda的过程中,特别提到无需将Anaconda路径添加到环境变量中。但是,出现错误后,集成终端可以启动Python,并且我能够运行代码。
接下来是,我无法运行一个简单的脚本后,查看在调试器中的任何变量,如在本教程在这里:
msg = "Hello World"
print(msg)
Run Code Online (Sandbox Code Playgroud)
我确实希望看到链接中显示的类似结果,例如dunder变量,我还launch.json按照stopOnEntry = True以下步骤进行了更新。
我想知道是否可以将Visual Studio Code与Anaconda一起用作解释器,而无需注册原始发行版中的变量,并且是否遗漏了任何必需的内容。
我希望这种体验会更加直接,但是我可能正在丢失某些东西,因为我正在Windows 10上运行。
好了,我的初始代码可以正常工作,但是错过了网站上一些奇怪的格式:
response.xpath("//*[contains(., 'Description:')]/following-sibling::p/text()").extract()
<div id="body">
<a name="main_content" id="main_content"></a>
<!-- InstanceBeginEditable name="main_content" -->
<div class="return_to_div"><a href="../../index.html">HOME</a> | <a href="../index.html">DEATH ROW</a> | <a href="index.html">INFORMATION</a> | text</div>
<h1>text</h1>
<h2>text</h2>
<p class="text_bold">text:</p>
<p>text</p>
<p class="text_bold">text:</p>
<p>text</p>
<p class="text_bold">Description:</p>
<p>Line1</p>
<p>Line2</p>
Line3 <!-- InstanceEndEditable -->
</div>
Run Code Online (Sandbox Code Playgroud)
我没有问题拉第1行和第2行。但是第3行不是我的P类的兄弟。这仅在我尝试从表中抓取的某些页面上发生。
这是链接:https : //www.tdcj.state.tx.us/death_row/dr_info/wardadamlast.html
抱歉,Xpath令我感到困惑,是否有一种方法可以提取符合条件的所有数据,//*[contains(., 'Description:')]而不必成为同级?
提前致谢。
编辑:更改了示例以更加反映实际情况。添加到原始页面的链接。
使用Canopy和Pandas,我有数据框a,其定义如下:
a=pd.read_csv('text.txt')
df=pd.DataFrame(a)
df.columns=["test"]
Run Code Online (Sandbox Code Playgroud)
test.txt是一个单列文件,包含一个包含文本,数字和标点符号的字符串列表.
假设df看起来像:
测试
%HGH&12
ABC123!
porkyfries
我希望我的结果是:
测试
hgh12
ABC123
porkyfries
到目前为止的努力:
from string import punctuation /-- import punctuation list from python itself
a=pd.read_csv('text.txt')
df=pd.DataFrame(a)
df.columns=["test"] /-- define the dataframe
for p in list(punctuation):
...: df2=df.med.str.replace(p,'')
...: df2=pd.DataFrame(df2);
...: df2
Run Code Online (Sandbox Code Playgroud)
上面的命令基本上只返回我相同的数据集.感谢任何线索.
编辑:我使用Pandas的原因是因为数据很大,跨越了大约1M行,未来编码的使用将应用于最多30M行的列表.简而言之,我需要以非常有效的方式为大数据集清理数据.
我正在尝试创建某种字典来附加我的结果并使用 jaro 距离函数获得最佳匹配。
这是我尝试匹配两个列表并在两个列表中获得最佳匹配名称的一部分。
例子:
import jellyfish
jellyfish.jaro_distance(u'jellyfish', u'sellyfish')
output:
0.9259259259259259
Run Code Online (Sandbox Code Playgroud)
我想做的是:
listA = ['grellofish','mellofush','jellyfihs','sellyfish','salmonfish']
listB = ['jellyfish','salmonfish']
#convert to unicode
listA = [unicode(i) for i in listA]
listB = [unicode(i) for i in listB]
for nickB in listB:
for nickA in listA:
results = jellyfish.jaro_distance(nickA, nickB)
print nickB,nickA,results
output:
jellyfish grellofish 0.825925925926
jellyfish mellofush 0.777777777778
jellyfish jellyfihs 0.962962962963
jellyfish sellyfish 0.925925925926
jellyfish salmonfish 0.685185185185
salmonfish grellofish 0.733333333333
salmonfish mellofush 0.7
salmonfish jellyfihs 0.618518518519
salmonfish sellyfish 0.755555555556
salmonfish salmonfish 1.0 …Run Code Online (Sandbox Code Playgroud) 我正在尝试获取不同列的字符串长度。似乎很简单:
df['a'].str.len()
Run Code Online (Sandbox Code Playgroud)
但是我需要将其应用于多个列。然后获得最低要求。
就像是:
df[['a','b','c']].str.len().min
Run Code Online (Sandbox Code Playgroud)
我知道上述方法不起作用,但希望您能理解。列a,b,c所有包含姓名,我想找回最短的名称。
同样由于数据量大,我避免创建其他列以节省大小。
我需要使用plotly绘制我的数据,但是这段代码没有给我任何结果,我显示我的数据,但没有任何数字:
import plotly.graph_objs as go
from plotly.offline import download_plotlyjs, init_notebook_mode, plot, iplot
data_t = []
for mac, dico_data in dict_info.items():
data_t.append(go.Scatter( x= dico_data['asn'], y= dico_data["time"], name=mac ))
print (data_t)
data = data_t
iplot(data_t)
Run Code Online (Sandbox Code Playgroud) 您有没有办法根据另一列获取列的子字符串?
import pandas as pd
x = pd.DataFrame({'name':['bernard','brenden','bern'],'digit':[2,3,3]})
x
digit name
0 2 bernard
1 3 brenden
2 3 bern
Run Code Online (Sandbox Code Playgroud)
我期望的是:
for row in x.itertuples():
print row[2][:row[1]]
be
bre
ber
Run Code Online (Sandbox Code Playgroud)
其中结果是基于数字的名称子字符串.
我知道如果我真的想要我可以创建一个基于itertuples函数的列表,但似乎不对,而且,我总是尝试创建一个矢量化方法.
感谢任何反馈.
我试图使用布尔掩码从2个不同的数据帧获得匹配.ü
使用逻辑OR运算符:
x = df[(df['A'].isin(df2['B']))
or df['A'].isin(df2['C'])]
Output:
ValueError: The truth value of a Series is ambiguous. Use a.empty, a.bool(), a.item(), a.any() or a.all().
Run Code Online (Sandbox Code Playgroud)
但是,使用按位OR运算符,结果将成功返回.
x = df[(df['A'].isin(df2['B']))
| df['A'].isin(df2['C'])]
Output: x
Run Code Online (Sandbox Code Playgroud)
这两者是否存在差异并且按位或者是最佳选择?为什么逻辑OR不起作用?
python ×10
pandas ×4
dataframe ×3
fuzzywuzzy ×2
algorithm ×1
anaconda ×1
conda ×1
fuzzy-search ×1
ipython ×1
large-data ×1
min ×1
plotly ×1
python-3.x ×1
scrapy ×1
web-scraping ×1
xpath ×1