gpt4 book ai didi

python - Pandas :从数据框中选择时速度慢

转载 作者:行者123 更新时间:2023-11-28 18:39:31 24 4
gpt4 key购买 nike

我有一个 DataFrame,它是根据我从数据库中获得的字典列表创建的。我正在尝试将其用作内存数据库,我使用以下函数对其进行查询:

def filter_entities(df, name1, name2):
key = ((df.name1 == name1) &
(df.name2 == name2))

rows = df.loc[key]
if len(rows) == 0:
return None
return rows.iloc[0]

这样做似乎比我预期的要慢得多。即使在几百行上进行测试,每次调用也需要大约 1 毫秒。我在创建数据框时尝试在这些列上设置索引,但这并不影响性能:

entities.set_index(['name1', 'name2'], drop=False, inplace=True)

这是创建测试数据集的快速方法:

import random, string
import pandas as pd
df = pd.DataFrame([{
'name1': ''.join([random.choice(string.letters) for i in range(10)]),
'name2': ''.join([random.choice(string.letters) for i in range(10)]),
'val1': random.randint(0, 2**16),
'val2': random.randint(0, 2**16),
'val3': random.randint(0, 2**16),
} for j in range(1000)])

In[27]: %timeit filter_entities(df, df['name1'][100], df['name2'][100])
1000 loops, best of 3: 1.91 ms per loop

我正试图找到一种有效的方法来查询我的数据。在 Pandas 中有更好的方法吗?

最佳答案

将列设置为索引确实提高了我的性能。

使用您原来的 filter_entities 函数:

In [25]: %timeit filter_entities(df, df['name1'][100], df['name2'][100])

1000 loops, best of 3: 1.36 ms per loop

然后将列设置为索引,然后索引该帧:

In [26]: df2 = df.set_index(['name1', 'name2'])

In [27]: %timeit df2.loc[df['name1'][100], df['name2'][100]]
10000 loops, best of 3: 160 µs per loop

请注意,在 filter_entities 函数中花费的大部分时间用于 bool 比较(创建 key,而不是索引本身)。

第二个注意事项:如果这种规模的性能对您很重要,那么在很多情况下,如果您需要以这种方式重复访问单个行,或者如果您可以更矢量化地进行访问,那么考虑更大的图片也很有用.

关于python - Pandas :从数据框中选择时速度慢,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/28303381/

24 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com