Python 优化数据帧到json的成本
我的目标是按1列对数据帧进行排序,并尽可能高效地返回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
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)解决方案,而不进行排序