Оптимизация сглаживания столбцов панда данных? - PullRequest
2 голосов
/ 15 марта 2019

У меня есть несколько столбцов в кадре данных, которые имеют числовые данные.Я хочу поделить каждый столбец, меняя каждое значение на q1, q2, q3 или q4.

В настоящее время я перебираю каждый столбец и изменяю их с помощью функции qcut pandas:

for column_name in df.columns:
    df[column_name] = pd.qcut(df[column_name].astype('float'), 4, ['q1','q2','q3','q4'])

Это очень медленно!Есть ли более быстрый способ сделать это?

1 Ответ

1 голос
/ 15 марта 2019

Немного поигрался со следующим примером. Похоже, преобразование в число с плавающей точкой увеличивает время. Хотя рабочий пример не был предоставлен, оригинальный тип не может быть известен. df[column].astype(copy=) представляется работоспособным при копировании или нет. Не за чем больше идти.

import pandas as pd
import numpy as np
import random
import time

random.seed(2)

indexes = [i for i in range(1,10000) for _ in range(10)]
df = pd.DataFrame({'A': indexes, 'B': [str(random.randint(1,99)) for e in indexes], 'C':[str(random.randint(1,99)) for e in indexes], 'D':[str(random.randint(1,99)) for e in indexes]})
#df = pd.DataFrame({'A': indexes, 'B': [random.randint(1,99) for e in indexes], 'C':[random.randint(1,99) for e in indexes], 'D':[random.randint(1,99) for e in indexes]})

df_result = pd.DataFrame({'A': indexes, 'B': [random.randint(1,99) for e in indexes], 'C':[random.randint(1,99) for e in indexes], 'D':[random.randint(1,99) for e in indexes]})

def qcut(copy, x):
    for i, column_name in enumerate(df.columns):
        s = pd.qcut(df[column_name].astype('float', copy=copy), 4, ['q1','q2','q3','q4'])
        df_result["col %d %d"%(x, i)] = s.values

times = []
for x in range(0,10):
    a = time.clock()
    qcut(True, x)
    b = time.clock()
    times.append(b-a)

print np.mean(times)

for x in range(10, 20):
    a = time.clock()
    qcut(False, x)
    b = time.clock()
    times.append(b-a)
print np.mean(times)

...