相关疑难解决方法(0)

大熊猫中非唯一索引的性能影响是什么?

从熊猫文档中,我收集到了独特值的索引使得某些操作有效,并且偶尔会容忍非唯一索引.

从外部来看,看起来不是非独特的指数以任何方式被利用.例如,以下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 indexing performance binary-search pandas

36
推荐指数
2
解决办法
1万
查看次数

为什么pandas.series.map如此惊人地慢?

有时候我只是讨厌使用中间件。以这个为例:我想拥有一个查找表,该表将一组输入(域)值中的值映射到输出(范围)值中。映射是唯一的。Python映射可以做到这一点,但是由于我认为该映射很大,所以为什么不使用ps.Series及其索引,它可以带来更多好处:

  • 传递多个值以映射为一个序列(希望比字典查找更快)
  • 结果中保留原始序列的索引

像这样:

domain2range = pd.Series(allrangevals, index=alldomainvals)
# Apply the map
query_vals = pd.Series(domainvals, index=someindex)
result = query_vals.map(domain2range)
assert result.index is someindex # Nice
assert (result.values in allrangevals).all() # Nice
Run Code Online (Sandbox Code Playgroud)

可以正常工作。但不是。上面的.map的时间成本len(domain2range)没有(更明智地)增加O(len(query_vals)),如下所示:

numiter = 100
for n in [10, 1000, 1000000, 10000000,]:
    domain = np.arange(0, n)
    range = domain+10
    maptable = pd.Series(range, index=domain).sort_index()

    query_vals = pd.Series([1,2,3])
    def f():
        query_vals.map(maptable)
    print n, timeit.timeit(stmt=f, number=numiter)/numiter


10 0.000630810260773
1000 0.000978469848633
1000000 0.00130645036697
10000000 0.0162791204453
Run Code Online (Sandbox Code Playgroud)

脸庞。在n = 10000000时,每个映射值占用(0.01 / …

python pandas

5
推荐指数
1
解决办法
561
查看次数

标签 统计

pandas ×2

python ×2

binary-search ×1

indexing ×1

performance ×1