팬더 데이터 프레임을 열 이름이있는 numpy 배열로 변환하는 방법

Nov 15 2020
  • 이것은 벡터화 된 방법을 사용해야하며 반복적이지 않습니다.

팬더 데이터 프레임에서 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

약 1,200 만 개의 행이 있습니다.

다음과 같은 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로 변환됩니다.

감사

답변

2 TrentonMcKinney Nov 15 2020 at 06:52
  • 다음 옵션 중 하나를 사용하여 "항목"및 "색상" 으로 val을 빠르게 검색합니다 .
    1. 사용 부울 색인을 판다
    2. 데이터 프레임을 numpy.recarryusing 으로 변환하고 pandas.DataFrame.to_records부울 인덱싱도 사용합니다.
  • .itempandas및 모두에 대한 메서드 numpy이므로 '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 편집에 대한 응답으로 업데이트

  • 먼저를 사용하여 데이터 프레임의 형태를 변경 pandas.DataFrame.pivot한 다음 앞서 언급 한 방법을 사용해야합니다.
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])