使用 pandas 优化字符串查询。大数据

lau*_*ngu 3 python indexing optimization pandas

我有一个数据框数据,其中有接近 400 万行。这是世界上城市的列表。我需要尽快查询城市名称。

我通过索引城市名称发现了 346 毫秒:

d2=data.set_index("城市",inplace=False)

timeit d2.loc[['巴黎']]

1 个循环,3 次最佳:每个循环 346 毫秒

这仍然太慢了。我想知道使用 group-by 是否可以实现更快的查询(如何进行这样的查询)。每个城市在数据框中大约有 10 行(重复城市)。网上查了好几天也没找到明确的解决办法

谢谢

All*_*len 5

设置

\n\n
df = pd.DataFrame(data=[[\'Paris\'+str(i),i] for i in range(100000)]*10,columns=[\'city\',\'value\'])\n
Run Code Online (Sandbox Code Playgroud)\n\n

基线

\n\n
df2 = df.set_index(\'city\')\n%timeit df2.loc[[\'Paris9999\']]\n10 loops, best of 3: 45.6 ms per loop\n
Run Code Online (Sandbox Code Playgroud)\n\n

解决方案

\n\n

使用查找字典,然后使用 iloc:

\n\n
idx_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\n
Run 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\n
Run Code Online (Sandbox Code Playgroud)\n