lau*_*ngu 3 python indexing optimization pandas
我有一个数据框数据,其中有接近 400 万行。这是世界上城市的列表。我需要尽快查询城市名称。
我通过索引城市名称发现了 346 毫秒:
d2=data.set_index("城市",inplace=False)
timeit d2.loc[['巴黎']]
1 个循环,3 次最佳:每个循环 346 毫秒
这仍然太慢了。我想知道使用 group-by 是否可以实现更快的查询(如何进行这样的查询)。每个城市在数据框中大约有 10 行(重复城市)。网上查了好几天也没找到明确的解决办法
谢谢
设置
\n\ndf = pd.DataFrame(data=[[\'Paris\'+str(i),i] for i in range(100000)]*10,columns=[\'city\',\'value\'])\nRun Code Online (Sandbox Code Playgroud)\n\n基线
\n\ndf2 = df.set_index(\'city\')\n%timeit df2.loc[[\'Paris9999\']]\n10 loops, best of 3: 45.6 ms per loop\nRun Code Online (Sandbox Code Playgroud)\n\n解决方案
\n\n使用查找字典,然后使用 iloc:
\n\nidx_dict = df.groupby(by=\'city\').apply(lambda x: x.index.tolist()).to_dict()\n\n%timeit df.iloc[d[\'Paris9999\']]\n1000 loops, best of 3: 432 \xc2\xb5s per loop\nRun Code Online (Sandbox Code Playgroud)\n\n看来这种方法比基线快了近 100 倍。
\n\n与其他方法相比:
\n\n%timeit df2[df2.index.values=="Paris9999"]\n100 loops, best of 3: 16.7 ms per loop\n\n%timeit full_array_based(df2, "Paris9999")\n10 loops, best of 3: 19.6 ms per loop\nRun Code Online (Sandbox Code Playgroud)\n