在Pandas中非常快速地访问部分行

时间:2014-07-27 22:05:16

标签: python performance pandas

我正在进行200亿次计算,事实证明,最慢的步骤是两个数量级,只是访问Pandas数据帧中的相关行。

%timeit x = query_results.ix[i]
10000 loops, best of 3: 155 µs per loop

我们怎样才能将速度降低一到两个数量级?

此Dataframe有200,000行和11列,所有字符串都是各种长度。使字符串固定长度几乎不会影响访问速度。使值浮动(这个用例不可行)会使速度降低一半左右。

编辑更多上下文: 这几乎是整个用例,使用BrenBarn的建议来使用iloc而不是ix。请注意,我们一次只能访问两行。大量的计算来自比较每一行到每一行(200,000 ^ 2/2)。

test = pd.DataFrame(index=arange(200000),columns=arange(11))
test.ix[:,:] = 'asdfasdf'

i = 0
j = 1

%timeit x = set(test.iloc[i]).intersection(test.iloc[j])
1000 loops, best of 3: 235 µs per loop

如果这个数字更像是5μs,那将是太棒了。

旁注,作为每个μs计数原因的示例:并非每个单元实际上都包含数据,因此我仍需要从结果数据中删除缺失值(nan),这将花费更多μs。对于这些目的,执行test.iloc[i].dropna()之类的操作非常慢。

1 个答案:

答案 0 :(得分:0)

In [21]: tx = test.values

In [22]: tx
Out[22]: 
array([['asdfasdf', 'asdfasdf', 'asdfasdf', ..., 'asdfasdf', 'asdfasdf',
        'asdfasdf'],
       ['asdfasdf', 'asdfasdf', 'asdfasdf', ..., 'asdfasdf', 'asdfasdf',
        'asdfasdf'],
       ['asdfasdf', 'asdfasdf', 'asdfasdf', ..., 'asdfasdf', 'asdfasdf',
        'asdfasdf'],
       ..., 
       ['asdfasdf', 'asdfasdf', 'asdfasdf', ..., 'asdfasdf', 'asdfasdf',
        'asdfasdf'],
       ['asdfasdf', 'asdfasdf', 'asdfasdf', ..., 'asdfasdf', 'asdfasdf',
        'asdfasdf'],
       ['asdfasdf', 'asdfasdf', 'asdfasdf', ..., 'asdfasdf', 'asdfasdf',
        'asdfasdf']], dtype=object)

In [23]: %timeit x = set(tx[i]).intersection(tx[j])
100000 loops, best of 3: 1.99 µs per loop