Цикл на датафрейме занимает много времени - PullRequest
0 голосов
/ 13 июня 2019

Функция подмножества данных используется в цикле for по строкам данных.Результат кажется точным, однако время, необходимое для завершения цикла в 2000 нечетных строках, составляет более 4 минут.Любой совет или руководство по качеству кода?

Datasets:

DF1 input   customer_id 31-12-2019 00:00    31-12-2018 00:00    31-12-2017 00:00    31-12-2016 00:00    31-12-2015 00:00    31-12-2014 00:00    31-12-2013 00:00    31-12-2012 00:00    31-12-2011 00:00    31-12-2010 00:00
    70464016                                        
    70453975                                        
    79983381                                        
    76615995                                        
    73543785                                        
    78226476                                        
    70117143                                        
    76448285                                        
    73980212                                        
    74540790    

File input
upload_date customer_id date    rating  rating_agency
05-03-2019  70464016    31-Dec-18   3   INTERNAL
05-03-2019  70453975    31-Dec-18   4+  INTERNAL
05-03-2019  79983381    31-Dec-18   3   INTERNAL
05-03-2019  76615995    31-Dec-18   4   INTERNAL
05-03-2019  73543785    31-Dec-18   4   INTERNAL
05-03-2019  78226476    31-Dec-18   4   INTERNAL
05-03-2019  70117143    31-Dec-18   4-  INTERNAL
05-03-2019  76448285    31-Dec-18   4-  INTERNAL
05-03-2019  73980212    31-Dec-18   5   INTERNAL
05-03-2019  74540790    31-Dec-18   5   INTERNAL
05-03-2019  76241783    31-Dec-18   5   INTERNAL
05-03-2019  76323368    31-Dec-18   5+  INTERNAL
05-03-2019  70732832    31-Dec-18   5   INTERNAL
05-03-2019  70453263    31-Dec-18   4-  INTERNAL
05-03-2019  73807515    31-Dec-18   5   INTERNAL
05-03-2019  71584306    31-Dec-18   5+  INTERNAL
05-03-2019  71017190    31-Dec-18   5   INTERNAL
05-03-2019  79142410    31-Dec-18   5   INTERNAL
05-03-2019  70455229    31-Dec-18   5   INTERNAL

Код выглядит следующим образом:

for j in df1.itertuples(index=True, name='Pandas'):
    for i in range(1,len(df1.columns)):
        #for j in range(len(df1)):
            flag = file[(file['customer_id'] == j.customer_id) & (file['year'] == df1.columns[i].year)]
            flag = flag[(flag['date']== flag['date'].max())]

            if len(flag) != 0:
                df1.iat[j.Index,i] = flag.rating.iloc[0]
            else:
                pass 

1 Ответ

0 голосов
/ 13 июня 2019

Я понял, что у вас есть некоторый код, который получает флаги откуда-то еще, и вы хотите увидеть, какие флаги есть для каждого значения в вашем фрейме данных. Я бы рекомендовал написать функцию, которая возвращает flag из значения DataFrame, а затем использовать df.applymap, чтобы применить функцию к каждому значению DataFrame.

df.applymap возвращает DataFrame, и он должен быть значительно быстрее. Цикл DataFrames в целом не очень эффективен и обычно его можно избежать.

def get_flags(val):
    flag = # Your code for the value of the flag here
    return flag

flags = df.applymap(get_flags)

Если в строке или столбце только один флаг, используйте df.apply. Подробнее в документации .

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...