Warning: file_get_contents(/data/phpspider/zhask/data//catemap/3/arrays/14.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Python 熊猫搜索速度/性能/效率_Python_Arrays_Performance_Loops_Pandas - Fatal编程技术网

Python 熊猫搜索速度/性能/效率

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,(任何结果与源文

ARR的ID#145有[A,B]结果。CRE的ID#145有[A,C]结果。下面您可以看到,我会将ID#145放入“不相同列表”。我的数据集包括445000行。我执行的过程每100行需要21秒。所以这需要7个多小时

这个循环中最慢的部分是什么?

我执行熊猫搜索的效率最高吗?

ItErrors()会更快吗?

编辑:关于预期输出的好观点。实际上我只是在等一份ID列表。如果AAR_列表和CRE_列表不相同,我想标记该ID并将其放入列表(不相同的列表)。所以我在寻找[145178989,(任何结果与源文档不匹配的ID)]


如果有人能为这个问题制作一个更好的表格,请这样做:

重写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')