Оптимизация стоимости pandas dataframe для json - PullRequest
0 голосов
/ 26 августа 2018

Моя цель - отсортировать фрейм данных по 1 столбцу и максимально эффективно вернуть объект json.

Для воспроизведения, пожалуйста, определите следующий фрейм данных:

import pandas as pd
import numpy as np
test = pd.DataFrame(data={'a':[np.random.randint(0,100) for i in range(10000)], 'b':[i + np.random.randint(0,100) for i in range(10000)]})

       a      b
0     74     89
1     55     52
2     53     39
3     26     21
4     69     34

Что янужно отсортировать по столбцу a и затем закодировать вывод в объекте json.Я беру основной подход и делаю:

test.sort_values('a', ascending=True, inplace=True) # n log n
data = [{}] # 1
for d in test.itertuples(): # n times
    to_append = {'id': d.Index, 'data': {'a': d.a, 'b': d.b}} # 3 
    data.append(to_append) # 1

Так стоит ли nlogn + n * 4?Есть ли более эффективные способы сделать это?

1 Ответ

0 голосов
/ 27 августа 2018

Я заметил, что pandas читает и пишет JSON медленнее, чем чистый python.Если вы уверены в том, что есть только два столбца, вы можете сделать что-то вроде этого:

data = [{'id' : x, 'data' : {'a' : y, 'b' : z}} 
            for x, (y, z) in zip(test.index, test.values.tolist())] 
json.dumps(data)

Если вам нужно беспокоиться о большем количестве столбцов, вы можете сделать что-то вроде:

c = test.columns
data = [{'id' : x, 'data' : dict(zip(c, y))} 
            for x, *y in zip(test.index, test.values.tolist())]
json.dumps(data)

Или, если вы можете с этим справиться, перед вызовом выполните reset_index вызов:

c = test.columns
data = [{'id' : x[0], 'data' : dict(zip(c, x[1:]))} 
            for x in test.reset_index().values.tolist()]
json.dumps(data)    
...