簡體   English   中英

如何將 Pandas 數據框轉換為帶有列名的 numpy 數組

[英]How to convert a pandas dataframe into a numpy array with the column names

  • 這必須使用矢量化方法,沒有迭代

我想從熊貓數據幀創建一個 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

大約有 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

每行是項目名稱,每列是顏色名稱。 項目和顏色的順序並不重要。 但是,在 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,因為它們對大型數據幀效率不高,因為如何在 Pandas 中的 DataFrame 中迭代行以及如何在 Pandas 中的 DataFrame 中迭代行Python Pandas 迭代行並訪問列名熊貓 iterrows 有性能問題嗎?

為此,我更喜歡 numpy 矢量化解決方案。

如何有效地將熊貓數據幀轉換為 numpy 數組? 該數組也將轉換為 torch.tensor。

謝謝

  • 使用以下選項之一通過“項目”和“顏色”快速搜索 val
    1. 使用熊貓布爾索引
    2. 使用pandas.DataFrame.to_records將數據幀轉換為numpy.recarry ,並使用布爾索引
  • .itempandasnumpy的方法,所以不要使用'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)]

更新以響應 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])

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM