Python 熊猫搜索速度/性能/效率
ARR的ID#145有[A,B]结果。CRE的ID#145有[A,C]结果。下面您可以看到,我会将ID#145放入“不相同列表”。我的数据集包括445000行。我执行的过程每100行需要21秒。所以这需要7个多小时 这个循环中最慢的部分是什么? 我执行熊猫搜索的效率最高吗? ItErrors()会更快吗? 编辑:关于预期输出的好观点。实际上我只是在等一份ID列表。如果AAR_列表和CRE_列表不相同,我想标记该ID并将其放入列表(不相同的列表)。所以我在寻找[145178989,(任何结果与源文档不匹配的ID)]Python 熊猫搜索速度/性能/效率,python,arrays,performance,loops,pandas,Python,Arrays,Performance,Loops,Pandas,ARR的ID#145有[A,B]结果。CRE的ID#145有[A,C]结果。下面您可以看到,我会将ID#145放入“不相同列表”。我的数据集包括445000行。我执行的过程每100行需要21秒。所以这需要7个多小时 这个循环中最慢的部分是什么? 我执行熊猫搜索的效率最高吗? ItErrors()会更快吗? 编辑:关于预期输出的好观点。实际上我只是在等一份ID列表。如果AAR_列表和CRE_列表不相同,我想标记该ID并将其放入列表(不相同的列表)。所以我在寻找[145178989,(任何结果与源文
如果有人能为这个问题制作一个更好的表格,请这样做:重写for循环的惯用方法是:
not_same_list = []
total_search_start_time = time.time()
tick = 0
for IDs in uniq_IDs['ID'].unique():
#Isolate rows by their ID and source doc
sco_ARR = uniq_IDs['outcome'][uniq_IDs['ID'] == IDs][uniq_IDs['Source_Doc'] == 'ARR']
sco_CRE = uniq_IDs['outcome'][uniq_IDs['ID'] == IDs][uniq_IDs['Source_Doc'] == 'CRE']
#Remove duplicates
ARR_list = set(sco_ARR.values.tolist())
CRE_list = set(sco_CRE.values.tolist())
#Check to see if outcomes match between source docs
if ARR_list != CHRI_list:
not_same_list.append(IDs)
if str(tick)[-2:] == '00':
print ('The last {} rows have taken {} seconds...'.format(tick,round(time.time()-total_search_start_time,2)))
tick += 1
else:
tick += 1
print ('The last {} rows have taken {} seconds...'.format(tick,round(time.time()-total_search_start_time,2)))
print (not_same_list)
for循环速度慢的原因是因为您处理的是未排序的数据,也就是说,您通过
ID
对数据帧进行子集,然后通过Source\u doc
对数据帧进行多次矢量扫描(取决于您拥有的唯一ID和Source\u doc的数量);使用groupby()
可以避免这个问题,因为它按组变量对数据帧进行排序,然后逐块处理
要了解更多关于这一理念的信息,请查看。我想试试这样的方法
(df.groupby(['ID', 'Source_doc'])['outcome'].apply(set)
.groupby(level=0).nunique()[lambda x: x==2].index)
# Int64Index([23145], dtype='int64', name='ID')
然后检查是否相等
d1 = df.groupby(['ID', 'Source_doc']).outcome.apply(set).unstack()
print(d1)
Source_doc ARR CRE
ID
23145 {B, A} {A, C}
23456 {B} {B}
您可以筛选d1
的索引,以获得不相等的ID
的列表
d1.ARR == d1.CRE
ID
23145 False
23456 True
dtype: bool
我怀疑drop\u duplicates
方法会有所帮助。你能不能也记下预期的输出?除了Jack Maney的建议外,我认为pandas代码中的一个常见危险标志是使用for
循环。将其组合为向量/矩阵运算通常会加快速度。实际上,这里的格式设置关闭了吗?在我看来,这里的for循环只是设置,然后不反复使用,ARR\u list
和CRE\u list
。我同意John Galt的观点,您应该提供一个预期的输出,以便更清楚地了解您希望它做什么。感谢您的澄清。我要试试这个,比较一下时间。实际上这个已经完成了,所以我的脑袋在转。我只是在验证结果。从7小时变为5分钟会很神奇。这有意义吗?如果你有大量的ID
,这是有意义的,ID的数量决定了for循环必须通过整个数据帧并对其进行子集的次数,这可能非常耗时。太好了,它看起来很有用。谢谢
d1.ARR == d1.CRE
ID
23145 False
23456 True
dtype: bool
d1.index[d1.ARR != d1.CRE]
Int64Index([23145], dtype='int64', name='ID')