【问题标题】:Efficient column indexing and selection in PANDASPANDAS 中的高效列索引和选择
【发布时间】:2016-04-28 08:22:00
【问题描述】:

我正在寻找从数据框中选择多列的最有效方法:

import pandas as pd
import numpy as np
df = pd.DataFrame(np.random.rand(4,8), columns = list('abcdefgh'))

我只想选择以下列 a、c、e、f、g 的列,这可以通过使用索引来完成:

df.ix[:,[0,2,4,5,6]]

对于多列的大型数据框,这似乎是一种效率低下的方法,如果可能的话,我宁愿按范围指定连续的列索引,但是像以下这样的尝试都会引发语法错误:

df.ix[:,[0,2,4:6]]

df.ix[:,[0,2,[4:6]]]

【问题讨论】:

    标签: python pandas multiple-columns


    【解决方案1】:

    一旦您选择了不相邻的列,您将支付负载。
    如果您的数据是同质的,回退到 numpy 会给您带来显着的改进。

    In [147]: %timeit df[['a','c','e','f','g']]
              %timeit df.values[:,[0,2,4,5,6]]
              %timeit df.ix[:,[0,2,4,5,6]]
              %timeit pd.DataFrame(df.values[:,[0,2,4,5,6]],columns=df.columns[[0,2,4,5,6]])
    100 loops, best of 3: 2.67 ms per loop
    10000 loops, best of 3: 58.7 µs per loop
    1000 loops, best of 3: 1.81 ms per loop 
    1000 loops, best of 3: 568 µs per loop
    

    【讨论】:

      【解决方案2】:

      我觉得你可以用range:

      print [0,2] + range(4,7)
      [0, 2, 4, 5, 6]
      
      
      print df.ix[:, [0,2] + range(4,7)]
                a         c         e         f         g
      0  0.278231  0.192650  0.653491  0.944689  0.663457
      1  0.416367  0.477074  0.582187  0.730247  0.946496
      2  0.396906  0.877941  0.774960  0.057290  0.556719
      3  0.119685  0.211581  0.526096  0.213282  0.492261
      

      【讨论】:

      【解决方案3】:

      Pandas 思路比较好,最短的路是最有效率的:

      df[['a','c','e','f','g']]
      

      您不需要 ix,因为它会在您的数据中进行搜索,但为此您显然需要列的名称。

      【讨论】:

      • 来自 pandas 文档:注意 Python 和 NumPy 索引运算符 [] 和属性运算符。在广泛的用例中提供对 pandas 数据结构的快速简便的访问。这使得交互式工作变得直观,因为如果您已经知道如何处理 Python 字典和 NumPy 数组,则几乎没有什么新东西要学习。但是,由于事先不知道要访问的数据的类型,因此直接使用标准运算符有一些优化限制。对于生产代码,我们建议您利用本章中公开的优化的 pandas 数据访问方法。
      猜你喜欢
      • 2017-11-20
      • 1970-01-01
      • 2018-10-07
      • 2016-10-16
      • 2017-01-13
      • 2013-10-09
      • 2021-10-24
      相关资源
      最近更新 更多