有人能指出我的链接或解释大熊猫索引的好处吗?我经常处理表并根据列加入它们,这个加入/合并过程似乎无论如何重新索引事物,所以考虑到我认为不需要,应用索引标准有点麻烦.
有关索引的最佳实践的任何想法?
从熊猫文档中,我收集到了独特值的索引使得某些操作有效,并且偶尔会容忍非唯一索引.
从外部来看,看起来不是非独特的指数以任何方式被利用.例如,以下ix查询足够慢,似乎正在扫描整个数据帧
In [23]: import numpy as np
In [24]: import pandas as pd
In [25]: x = np.random.randint(0, 10**7, 10**7)
In [26]: df1 = pd.DataFrame({'x':x})
In [27]: df2 = df1.set_index('x', drop=False)
In [28]: %timeit df2.ix[0]
1 loops, best of 3: 402 ms per loop
In [29]: %timeit df1.ix[0]
10000 loops, best of 3: 123 us per loop
Run Code Online (Sandbox Code Playgroud)
(我意识到这两个ix查询不会返回相同的东西 - 它只是一个调用ix非唯一索引的示例显得慢得多)
有没有办法哄骗熊猫使用更快的查找方法,如二元搜索非唯一和/或排序索引?
不久前,我接受了数据科学家职位的采访。奇怪的是,在不询问机器学习或数据科学乃至统计问题的情况下,我被赋予了一项小任务,即将两个熊猫数据框连接起来,并比较各种方法。我没有得到期望的标准。我提供了多种解决方案。令人惊讶的是,之后有人告诉我,我的解决方案均未达到该任务所需其他解决方案的性能基准!显然,我要求提供反馈或他们用于此任务的其他方法优于我提供的解决方案,但请回答;不只是 我认为自己是一名中级Python程序员,并且我当然不了解许多技巧或最佳实践,并且到目前为止,我对性能的关注不是很多,除非它非常慢。因此自面试以来
问题:
# Randomly generated historical data about how many megabytes were downloaded from the Internet."HoD" is the Hour of the Day!
hist_df = pd.DataFrame(columns=['HoD', 'Volume'])
hist_df['HoD'] = np.random.randint(0, 24, 365 * 24)
hist_df['Volume'] = np.random.uniform(1, 1000, 365 * 24)
# Tariffs based on the hour of the day
tariffs_df = pd.DataFrame({
'Time range': ['00:00 to 09:00', '09:00 to 18:00', '18:00 to 00:00'],
'cost': [10, 14, 22]
})
Run Code Online (Sandbox Code Playgroud)
任务:返回历史数据框,并带有附加的“费用”列,该列将显示历史数据每小时每小时花费多少钱。基本上,关税数据框架需要合并到历史数据中。
我的解决方案:这是包含我提供的四种方法的要点。我提供了基于(最慢到最快)i)简单迭代(最慢),ii)pandas_apply,iii)和numpy向量化以及iv)pandas binning(最快)的合并。结果为(以秒为单位):
{'naive_iterrows': 5.810565948486328,
'pandas_apply': 0.6743350028991699, …Run Code Online (Sandbox Code Playgroud)