簡體   English   中英

優化熊貓數據框列的四分位數?

[英]Optimising quartiling of columns of panda dataframe?

我在具有數字數據的數據框中有多列。 我想對每一列進行四分位數,將每個值更改為 q1、q2、q3 或 q4。

我目前遍歷每一列並使用 pandas qcut 函數更改它們:

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

這很慢! 有沒有更快的方法來做到這一點?

稍微玩了一下下面的例子。 看起來從字符串轉換為浮點數會增加時間。 雖然沒有提供工作示例,因此無法知道原始類型。 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)

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM