Dataframe .iloc低速性能

时间:2017-04-03 18:23:41

标签: python pandas

我正在使用pandas库,我在pandas上使用.iloc时遇到了一些性能问题。

主要软件的想法是搜索数据帧的每一行和每列,如果达到任何条件,请使用新值更新此数据帧的特定行和列。

下面是以下几行代码:

for cont, val in enumerate(id_truck_list):
    print cont
    for index, row in all_travel.iterrows():
        id_tr = int(all_travel.iloc[index, 0])
        begin = all_travel.iloc[index, 5]
        end = all_travel.iloc[index, 11]
        if int(val) == id_tr:
            #print "test1"
            #print id_tr
            #print begin_list[cont]
            #print begin
            #print end_list[cont]
            #print end
            if begin_list[cont] >= begin:
                if  end_list[cont] <= begin:
                    pass
                else:
                    #print 'h1'
                    all_travel.iloc[index, 18] =  all_travel.iloc[index, 18] + 3 
            else:
                if begin < end_list[cont] :
                    if end <= end_list[cont]:
                        #print 'h2'
                        #print(all_travel.iloc[index, 18])
                        all_travel.iloc[index, 18] = all_travel.iloc[index, 18] + 5
                        #print(all_travel.iloc[index, 18])
                        #print str(index)
                    else:
                        #print 'h3'
                        all_travel.iloc[index, 18] = all_travel.iloc[index, 18] + 7
                else:
                    pass

这个想法以非常缓慢的方式执行(或多或少每分钟10行)。你对使用pandas库有什么想法吗

下面是all_travel.head()

truck_id  id_farm gatec_dist gps_go_dist gps_ret_dist             t1gatec  \
0  2010028.0     76.0         11     11.8617     0.211655 2016-03-09 00:24:00   
1  2010028.0      1.0       16.2        9.86    0.0637544 2016-03-13 23:57:00   
2  2010028.0     75.0         18       10.78         9.65 2016-03-18 09:17:00   
3  2010028.0     62.0          6     8.51291      3.99291 2016-03-19 20:16:00   
4  2010028.0     62.0          6        2.91    0.0428008 2016-03-21 03:00:00   

             t1gps t2gatec                t2gps t3gatec  \
0  03/09/2016 00:09:58       0  03/09/2016 00:43:46       0   
1  03/13/2016 23:46:00       0  03/14/2016 00:53:10       0   
2  03/18/2016 09:13:15       0  03/18/2016 10:17:14       0   
3  03/19/2016 20:29:59       0  03/19/2016 21:22:40       0   
4  03/21/2016 02:49:34       0  03/21/2016 03:38:59       0   

             t3gps             t4gatec                t4gps   wait_mill  \
0  03/09/2016 07:00:15 2016-03-09 02:14:55  03/09/2016 02:14:55  154.500000   
1  03/14/2016 13:54:30 2016-03-14 01:12:58  03/14/2016 01:12:58  124.733333   
2  03/18/2016 12:07:00 2016-03-18 12:37:41  03/18/2016 12:44:01  408.316667   
3  03/19/2016 23:57:22 2016-03-19 22:00:08  03/19/2016 22:00:08  256.083333   
4  03/22/2016 00:09:56 2016-03-21 04:01:20  03/21/2016 04:01:20   47.333333   

go_field   wait_field     ret_mill    tot_trav  maintenance_level  
0  33.800000   376.483333  -285.333333  124.950000                  1  
1  67.166667   781.333333  -761.533333   86.966667                  1  
2  63.983333   109.766667    37.016667  210.766667                  1  
3  52.683333   154.700000  -117.233333   90.150000                  1  
4  49.416667  1230.950000 -1208.600000   71.766667                  1  

1 个答案:

答案 0 :(得分:0)

我做了另一个解决方案,提高了我的速度性能。 我将数据帧的部分更改为列表,因为使用列表对正常数据帧的性能更好。 结论,现在我需要等待两分钟才能得到答案,而不是3天。

Bellow遵循修改

for cont, val in enumerate(id_truck_list):
    for cont2, val2 in enumerate(id_truck_list2):
        id_tr = int(id_truck_list2[cont2])
        begin = begin_list2[cont2]
        end = end_list2[cont2]
        if int(id_truck_list[cont]) == id_tr:
            if begin_list[cont] >= begin:
                if  begin_list[cont] >= end:
                    pass
                else:
                    maintenance_list[cont2] =  maintenance_list[cont2] + 3
            else:
                if begin < end_list[cont] :
                    if end <= end_list[cont]:
                        #print 'h2'
                        maintenance_list[cont2] = maintenance_list[cont2] + 
                        #print str(index)
                    else:
                        #print 'h3'
                        maintenance_list[cont2] = maintenance_list[cont2] + 
                else:
                    pass

print 'list size ' + str(len(maintenance_list))
for cont3, val3 in enumerate(maintenance_list):
    print 'list update  ' + str(cont3)
    all_travel.iloc[cont3, 18] = maintenance_list[cont3]