Python 优化数据帧到json的成本

Python 优化数据帧到json的成本,python,pandas,performance,benchmarking,Python,Pandas,Performance,Benchmarking,我的目标是按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 7

我的目标是按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吗?有没有更有效的方法

我注意到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\u 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)    

列始终是整数还是可以是任意类型?@user它是整数/浮点。我曾想过创建一个有序字典并直接将数据放在那里而不进行排序,例如,
d[a]={#something}
,然后转换为jsonOrdered dict将是错误的选择,因为它跟踪数据插入的顺序。如果一个是唯一的整数,您可以使用dict的hashfunction,因为dict的自然顺序是基于对键进行散列,如果是整数,则散列就是整数(有些例外情况类似于-1)。然而,浮点数弄乱了这个概念,但是你可以使用类似的解决方法:@user我认为我的例子中所有的“a”都是整数,但我只是想看看是否可能generilise@PabTorre不幸的是,它的格式不同。另外,代码也是n log n,我希望看到一个o(n)解决方案,而不进行排序