我在熊猫数据框中存储了大约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-给我相同的时间,但他们却不会。
这是我的两个问题:
谢谢