2015-08-09 6 views
1

Если значения в столбце Pandas DataFrame timestampMs имеют тип unicode, и мы хотим преобразовать его в float, существует ли разница между следующими двумя методами?Преобразование типа данных столбца Pandas

df['timestampMs'].map(lambda x: float(x)/1000) 

и

df['timestampMs'].astype('float')/1000 

Так как они оба, кажется, дают те же результаты, что является предпочтительным методом?

+0

Читать эту https://github.com/pydata/pandas/blob/a7437430b5cb62e49a79b64d18eccfb2b4d6367f/pandas/core/internals.py#L375 и принять решение о приемлемой зависимости от ваших критериев для "предпочтительных '. Ваш первый пример не будет выполнен, если одно значение - «-», например. – jonnybazookatone

ответ

2

Хм ... если вам небезразлична скорость, метод лямбда немного быстрее для небольших наборов данных. Для больших наборов данных идут по методу .astype() (я лично считаю его более читаемым):

import time 
import timeit 
import pandas as pd 

num_elements = 100 
times = [unicode(time.clock()) for x in range(num_elements)] 

df = pd.DataFrame(times) 

def first_method(): 
    df[0].map(lambda x: float(x)/1000) 

def second_method(): 
    df[0].astype('float')/1000 

num_reps = 15000 

print("First method time for {} reps: {}".format(num_reps, timeit.timeit(first_method, number=num_reps))) 
print("Second method time for {} reps: {}".format(num_reps, timeit.timeit(second_method, number=num_reps))) 

Когда num_elements = 100 я получаю:

First method time for 15000 reps: 1.95685731342 
Second method time for 15000 reps: 2.22381265566 

Когда num_elements = 1000 я получаю:

First method time for 15000 reps: 12.0774245498 
Second method time for 15000 reps: 6.77670391568 
Смежные вопросы