【问题标题】:How to convert a pandas DataFrame subset of columns AND rows into a numpy array?如何将 Pandas DataFrame 的列和行子集转换为 numpy 数组?
【发布时间】:2013-07-14 23:48:54
【问题描述】:

我想知道是否有一种更简单、内存效率高的方法来从 pandas DataFrame 中选择行和列的子集。

例如,给定这个数据框:

df = DataFrame(np.random.rand(4,5), columns = list('abcde')) 打印 df 一个 b c d e 0 0.945686 0.000710 0.909158 0.892892 0.326670 1 0.919359 0.667057 0.462478 0.008204 0.473096 2 0.976163 0.621712 0.208423 0.980471 0.048334 3 0.459039 0.788318 0.309892 0.100539 0.753992

我只想要那些列“c”的值大于 0.5 的行,但我只需要这些行的列“b”和“e”。

这是我想出的方法——也许有更好的“熊猫”方法?

locs = [df.columns.get_loc(_) for _ in ['a', 'd']] 打印 df[df.c > 0.5][locs] 广告 0 0.945686 0.892892

我的最终目标是将结果转换为 numpy 数组以传递给 sklearn 回归算法,因此我将像这样使用上面的代码:

training_set = array(df[df.c > 0.5][locs])

... 这让我很恼火,因为我最终在内存中得到了一个巨大的数组副本。也许还有更好的方法?

【问题讨论】:

    标签: python arrays numpy pandas scikit-learn


    【解决方案1】:

    直接使用它的值:

    In [79]: df[df.c > 0.5][['b', 'e']].values
    Out[79]: 
    array([[ 0.98836259,  0.82403141],
           [ 0.337358  ,  0.02054435],
           [ 0.29271728,  0.37813099],
           [ 0.70033513,  0.69919695]])
    

    【讨论】:

    • 我不知道 .values 属性。很不错!此外,由于您消除了单引号和括号,而是直接使用了 df.c,因此更加简洁。
    • 不错,但它与as_matrix 有何不同?
    • 只是一个更新,因为我只是想知道 as_matrix 和 .values 之间的区别(因为我只使用 .values)。事实证明,提供 as_matrix 只是为了向后兼容,建议使用 .values 代替。见pandas.pydata.org/pandas-docs/version/0.17.1/generated/…
    • 遗憾的是 .values 不允许过滤或排序列。
    【解决方案2】:

    对于第一个问题,可能是这样的,您可以简单地通过名称访问列:

    >>> df = pd.DataFrame(np.random.rand(4,5), columns = list('abcde'))
    >>> df[df['c']>.5][['b','e']]
              b         e
    1  0.071146  0.132145
    2  0.495152  0.420219
    

    对于第二个问题:

    >>> df[df['c']>.5][['b','e']].values
    array([[ 0.07114556,  0.13214495],
           [ 0.49515157,  0.42021946]])
    

    【讨论】:

      【解决方案3】:

      .loc 同时接受行和列选择器(.ix/.iloc 仅供参考) 这也是一次性完成的。

      In [1]: df = DataFrame(np.random.rand(4,5), columns = list('abcde'))
      
      In [2]: df
      Out[2]: 
                a         b         c         d         e
      0  0.669701  0.780497  0.955690  0.451573  0.232194
      1  0.952762  0.585579  0.890801  0.643251  0.556220
      2  0.900713  0.790938  0.952628  0.505775  0.582365
      3  0.994205  0.330560  0.286694  0.125061  0.575153
      
      In [5]: df.loc[df['c']>0.5,['a','d']]
      Out[5]: 
                a         d
      0  0.669701  0.451573
      1  0.952762  0.643251
      2  0.900713  0.505775
      

      如果你想要这些值(尽管这应该直接传递给 sklearn);框架支持数组接口

      In [6]: df.loc[df['c']>0.5,['a','d']].values
      Out[6]: 
      array([[ 0.66970138,  0.45157274],
             [ 0.95276167,  0.64325143],
             [ 0.90071271,  0.50577509]])
      

      【讨论】:

      • 最优雅。 .ix 和 .loc 有什么区别?
      • loc 根本不会尝试使用数字(例如 1)作为位置参数(而是会引发);查看主要的 pandas 文档/选择数据
      猜你喜欢
      • 2018-12-27
      • 1970-01-01
      • 2019-08-04
      • 2020-02-10
      • 2018-01-01
      • 1970-01-01
      • 2017-02-11
      • 2020-07-12
      • 1970-01-01
      相关资源
      最近更新 更多