如何将 pandas 数据框转换为带有列名的 numpy 数组

use*_*011 5 python numpy dataframe pandas pytorch

  • 这必须使用向量化方法,无需迭代

我想从 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
Run Code Online (Sandbox Code Playgroud)

大约有 12,000 万行。

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

item    green    blue     red
book    -22.70  -109.60   null
car     -11.20   null     -57.19
bike    null    -25.60    -33.16
Run Code Online (Sandbox Code Playgroud)

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

例如

 how to know that -57.19 is for "car" and "red" in numpy array ? 
Run Code Online (Sandbox Code Playgroud)

因此,我需要创建一个字典来保存以下之间的映射:

  item <--> row index in the numpy array
  color <--> col index in the numpy array
Run Code Online (Sandbox Code Playgroud)

我不想使用 iteritems 和 itertuples,因为它们对于大型数据帧效率不高,原因是How to iterate over rows in a DataFrame in Pandas以及How to iterate over rows in a DataFrame in Pandas and Python Pandas iterate over rows and access columns name pandas iterrows是否有性能问题?

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

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

谢谢

Tre*_*ney 4

  • 使用以下选项之一 通过“项目”和“颜色”快速搜索 val :
    1. 使用pandas 布尔索引
    2. 将数据帧转换为numpy.recarryusing pandas.DataFrame.to_records,并使用布尔索引
  • .itempandas是 和的方法numpy,因此不要用作'item'列名。它已更改为'_item'.
  • 仅供参考,numpy是一种pandas依赖关系,许多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)]
Run Code Online (Sandbox Code Playgroud)

响应 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])
Run Code Online (Sandbox Code Playgroud)