在多索引数据帧中使用部分索引进行选择要比单索引数据帧慢

时间:2019-08-27 08:15:14

标签: performance dataframe select

我在熊猫数据框中存储了大约10万个城市及其相关的州和国家。然后,我需要根据城市(例如洛杉矶),州(例如北卡罗莱纳州)或国家(地区)有效地选择行。

在阅读了许多关于SO的线程之后,我尝试了各种选择方法并对它们进行计时。

1-按行选择:

     print(timeit.Timer(lambda: df[df['city_name'] == 'los angeles']).timeit(1000))

==> 6.23秒(1000次迭代)

2-设置索引未排序排序并使用loc:

     df = df.set_index(['city_name'])
     print(timeit.Timer(lambda: df.loc['los angeles']).timeit(1000))

==> 2.2秒(1000次迭代)

3-设置索引和排序

     df = df.set_index(['city_name'])
     df = df.sort_index()
     print(timeit.Timer(lambda: df.loc['los angeles']).timeit(1000))

==> 0.40s 1000次迭代

最快的方法是使用#3包裹住try catch来处理键不存在的情况(比使用键交叉点更快)。

    try:
        test = df.loc['los angeles']
    except:
        pass

现在除了城市以外,我还希望能够按国家或州(但不是组合)进行搜索,因此我定义了一个多索引。 (请注意,当我稍后细化选定的行时,不能选择具有多个数据框,一个用于城市,一个用于州,一个用于国家)。

4-排序的多索引,使用.loc按城市名称选择

    df = df.set_index(['city_name', 'country_name', 'state_name'], drop=True)
    df = df.sort_index()
    print(timeit.Timer(lambda: df.loc['los angeles']).timeit(1000))

==> 1.09秒

令我惊讶的是,即使我基本上在执行相同的操作:使用单个索引选择一组行,时间也几乎翻了三倍。

5-然后我尝试使用xs允许我使用任何索引进行搜索:

    print(timeit.Timer(lambda: df.xs('los angeles', level='city_name')).timeit(1000))

==> 1.23秒

6-我也尝试使用get_level_values

    print(timeit.Timer(lambda: sorted_data.iloc[df.index.get_level_values('city_name') == 'los angeles']).timeit(1000))   

==> 10.6秒

7-最后我尝试使用查询

    query = 'city_name == "los angeles"'
    print(timeit.Timer(lambda: df.query(query)).timeit(1000))    

==> 22.78秒

使用多索引数据框(例如[city_name,州,国家/地区])并使用单个索引选择行(例如city_name)时,我希望时间等于选择具有单个索引的数据框。 本质上,我希望3-和4-给我相同的时间,但他们却不会。

这是我的两个问题:

  1. 为什么3-和4-不能提供相似的结果?
  2. 是否有比5更有效的方法来查询多索引数据帧,但一次仅提供一个索引(例如city_name或 州或国家/地区)

谢谢

0 个答案:

没有答案