【问题标题】:How to convert a pandas dataframe into a numpy array with the column names如何将 pandas 数据框转换为具有列名的 numpy 数组
【发布时间】:2021-02-26 13:32:48
【问题描述】:
  • 这必须使用矢量化方法,没有迭代

我想从 pandas 数据框创建一个 numpy 数组。

我的代码:

import pandas as pd
_df = pd.DataFrame({'itme': ['book', 'book' , 'car', ' car', 'bike', 'bike'], 'color': ['green', 'blue' , 'red', 'green' , 'blue', 'red'], 'val' : [-22.7, -109.6, -57.19, -11.2, -25.6, -33.61]})
 
item     color    val
book    green   -22.70
book    blue    -109.60
car     red     -57.19
car     green   -11.20
bike    blue    -25.60
bike    red     -33.61

大约有 12000 万行。

我需要创建一个 numpy 数组,例如:

item    green    blue     red
book    -22.70  -109.60   null
car     -11.20   null     -57.19
bike    null    -25.60    -33.16

每一行是项目名称,每一列是颜色名称。 项目和颜色的顺序并不重要。 但是,在 numpy 数组中,没有行名和列名,我需要为每个值保留项目和颜色名称,以便我知道该值在 numpy 数组中代表什么。

例如

 how to know that -57.19 is for "car" and "red" in numpy array ? 

所以,我需要创建一个字典来保持:

  item <--> row index in the numpy array
  color <--> col index in the numpy array

我不想使用 iteritems 和 itertuples,因为由于 How to iterate over rows in a DataFrame in PandasHow to iterate over rows in a DataFrame in PandasPython Pandas iterate over rows and access column namesDoes pandas iterrows have performance issues?,它们对于大型数据帧效率不高

我更喜欢 numpy 向量化解决方案。

如何有效地将 pandas 数据帧转换为 numpy 数组? 该数组也将转换为 torch.tensor。

谢谢

【问题讨论】:

    标签: python pandas numpy dataframe pytorch


    【解决方案1】:
    • 使用以下选项之一通过“项目”和“颜色”快速搜索 val:
      1. 使用pandas Boolean indexing
      2. 使用pandas.DataFrame.to_records 将数据帧转换为numpy.recarry,同时使用布尔索引
    • .itempandasnumpy 的方法,所以不要使用'item' 作为列名。已改为'_item'
    • 仅供参考,numpypandas 依赖项,pandas 的大部分矢量化功能直接对应于 numpy
    import pandas as pd
    import numpy as np
    
    # test data
    df = pd.DataFrame({'_item': ['book', 'book' , 'car', 'car', 'bike', 'bike'], 'color': ['green', 'blue' , 'red', 'green' , 'blue', 'red'], 'val' : [-22.7, -109.6, -57.19, -11.2, -25.6, -33.61]})
    
    # Use pandas Boolean index to
    selected = df[(df._item == 'book') & (df.color == 'blue')]
    
    # print(selected)
    _item color    val
     book  blue -109.6
    
    # Alternatively, create a recarray
    v = df.to_records(index=False)
    
    # display(v)
    rec.array([('book', 'green',  -22.7 ), ('book', 'blue', -109.6 ),
               ('car', 'red',  -57.19), ('car', 'green',  -11.2 ),
               ('bike', 'blue',  -25.6 ), ('bike', 'red',  -33.61)],
              dtype=[('_item', 'O'), ('color', 'O'), ('val', '<f8')])
    
    # search the recarray
    selected = v[(v._item == 'book') & (v.color == 'blue')]
    
    # print(selected)
    [('book', 'blue', -109.6)]
    

    更新以响应 OP 编辑​​

    dfp = df.pivot(index='_item', columns='color', values='val')
    
    # display(dfp)
    color   blue  green    red
    _item                     
    bike   -25.6    NaN -33.61
    book  -109.6  -22.7    NaN
    car      NaN  -11.2 -57.19
    
    # create a numpy recarray
    v = dfp.to_records(index=True)
    
    # display(v)
    rec.array([('bike',  -25.6,   nan, -33.61),
               ('book', -109.6, -22.7,    nan),
               ('car',    nan, -11.2, -57.19)],
              dtype=[('_item', 'O'), ('blue', '<f8'), ('green', '<f8'), ('red', '<f8')])
    
    # select data
    selected = v.blue[(v._item == 'book')]
    
    # print(selected)
    array([-109.6])
    

    【讨论】:

      猜你喜欢
      • 2016-03-31
      • 2014-03-23
      • 2020-06-20
      • 1970-01-01
      • 2019-02-25
      • 2022-01-12
      • 2019-04-19
      相关资源
      最近更新 更多