【问题标题】:Selecting columns from numpy recarray从 numpy recarray 中选择列
【发布时间】:2023-04-02 10:43:02
【问题描述】:

我有一个来自 numpy.core.records.recarray 类型的对象。我想将它有效地用作熊猫数据框。更准确地说,我想使用它的列的一个子集来获得一个新的recarray,就像你做pandas_dataframe[[selected_columns]]一样。

实现这一目标的最简单方法是什么?

【问题讨论】:

    标签: numpy pandas multidimensional-array dataframe recarray


    【解决方案1】:

    不使用 pandas,您可以选择结构化数组 (recarray) 的字段子集。例如:

    In [338]: dt=np.dtype('i,f,i,f')
    In [340]: A=np.ones((3,),dtype=dt)
    In [341]: A[:]=(1,2,3,4)
    
    In [342]: A
    Out[342]: 
    array([(1, 2.0, 3, 4.0), (1, 2.0, 3, 4.0), (1, 2.0, 3, 4.0)], 
          dtype=[('f0', '<i4'), ('f1', '<f4'), ('f2', '<i4'), ('f3', '<f4')])
    

    字段的子集。

    In [343]: B=A[['f1','f3']].copy()
    
    In [344]: B
    Out[344]: 
    array([(2.0, 4.0), (2.0, 4.0), (2.0, 4.0)], 
          dtype=[('f1', '<f4'), ('f3', '<f4')])
    

    可以独立于A进行修改:

    In [346]: B['f3']=[.1,.2,.3]
    
    In [347]: B
    Out[347]: 
    array([(2.0, 0.10000000149011612), (2.0, 0.20000000298023224),
           (2.0, 0.30000001192092896)], 
          dtype=[('f1', '<f4'), ('f3', '<f4')])
    
    In [348]: A
    Out[348]: 
    array([(1, 2.0, 3, 4.0), (1, 2.0, 3, 4.0), (1, 2.0, 3, 4.0)], 
          dtype=[('f0', '<i4'), ('f1', '<f4'), ('f2', '<i4'), ('f3', '<f4')])
    

    字段的结构化子集不高度发达。 A[['f0','f1']] 足以查看,但如果您尝试修改该子集,它会发出警告或出错。这就是我使用copyB 的原因。

    有一组函数可以帮助在重新数组中添加和删除字段。我将不得不查找访问模式。但主要是构造一个新的dtype,和一个空数组,然后按名称复制字段。

    import numpy.lib.recfunctions as rf
    

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 2012-07-03
      • 1970-01-01
      • 1970-01-01
      • 2012-04-14
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      相关资源
      最近更新 更多