2015-08-06 2 views
0

У меня есть дата-карта данных pandas, содержащая данные из файла csv. Я хочу конкатенировать несколько столбцов, я сначала жестко запрограммировал это с помощью простой конкатенации столбцов pandas, тогда я реорганизовал код как более общий, но я сильно оштрафован с точки зрения времени выполнения, вот две версии конкатенации и их тайминги:ухудшение производительности при переключении с конкатенации столбцов pandas на использование применяются к dataframe

t0 = time.time() 
    cleaned_data_set1 = data_set.col1.map(str)+" "+data_set.col2.map(str)+ " " + data_set.col3.map(str) 
    t1 = time.time() 

    print t1-t0 
    listOfObjectAttributeNames = ["col1","col2","col3"] 
    t0 = time.time() 
    cleaned_data_set = data_set.apply(lambda x: " ".join([str(el) for el in x[listOfObjectAttributeNames]]), axis=1) 
    t1 = time.time() 

здесь время выполнения соответственно:

1.20745110512 
171.689060926 

Как я могу улучшить время выполнения второй версии?

+0

Не ответ, но стоит отметить, что лучше использовать 'timeit' для измерения времени выполнения – yangjie

+0

Первая версия - это векторизованный подход, это всегда лучший подход, потому что он быстрее. Вторая версия - это не-векторизованный подход, вы оптимизируете его, используя версию 1. – firelynx

+0

@firelynx, спасибо за помощь, я бы хотел использовать первую версию, но я все еще не могу указать имена столбцов динамически, можете ли вы помочь с этим? – MedAli

ответ

0

мне удалось сохранить векторизованную версию и обобщать работу следующим образом:

 t0 = time.time() 

     listOfObjectAttributeNames = ["col1","col2","col3"] 

     cleaned_data_set = "" 
     for i in listOfObjectAttributeNames: 
      cleaned_data_set = cleaned_data_set + data_set[i].map(str) 

     t1 = time.time() 

     print t1 - t0 

перспективы результат времени:

1.04347801208 
Смежные вопросы