แปลง dataframe แพนด้าเป็นอาร์เรย์ NumPy


465

ฉันสนใจที่จะรู้วิธีการแปลงดาต้าดาต้าแพนด้าเป็นอาเรม NumPy

dataframe:

import numpy as np
import pandas as pd

index = [1, 2, 3, 4, 5, 6, 7]
a = [np.nan, np.nan, np.nan, 0.1, 0.1, 0.1, 0.1]
b = [0.2, np.nan, 0.2, 0.2, 0.2, np.nan, np.nan]
c = [np.nan, 0.5, 0.5, np.nan, 0.5, 0.5, np.nan]
df = pd.DataFrame({'A': a, 'B': b, 'C': c}, index=index)
df = df.rename_axis('ID')

จะช่วยให้

label   A    B    C
ID                                 
1   NaN  0.2  NaN
2   NaN  NaN  0.5
3   NaN  0.2  0.5
4   0.1  0.2  NaN
5   0.1  0.2  0.5
6   0.1  NaN  0.5
7   0.1  NaN  NaN

ฉันต้องการแปลงเป็นอาร์เรย์ NumPy ดังนี้:

array([[ nan,  0.2,  nan],
       [ nan,  nan,  0.5],
       [ nan,  0.2,  0.5],
       [ 0.1,  0.2,  nan],
       [ 0.1,  0.2,  0.5],
       [ 0.1,  nan,  0.5],
       [ 0.1,  nan,  nan]])

ฉันจะทำสิ่งนี้ได้อย่างไร


ในฐานะโบนัสเป็นไปได้หรือไม่ที่จะอนุรักษ์ dtypes เช่นนี้?

array([[ 1, nan,  0.2,  nan],
       [ 2, nan,  nan,  0.5],
       [ 3, nan,  0.2,  0.5],
       [ 4, 0.1,  0.2,  nan],
       [ 5, 0.1,  0.2,  0.5],
       [ 6, 0.1,  nan,  0.5],
       [ 7, 0.1,  nan,  nan]],
     dtype=[('ID', '<i4'), ('A', '<f8'), ('B', '<f8'), ('B', '<f8')])

หรือคล้ายกัน


5
ทำไมคุณต้องการสิ่งนี้ ไม่ได้เป็น dataframes จากอาร์เรย์ numpy อย่างไรก็ตาม คุณควรจะสามารถใช้ dataframe ที่คุณต้องการอาร์เรย์ numpy นั่นเป็นเหตุผลที่คุณสามารถใช้ dataframes กับ scikit เรียนรู้ที่ฟังก์ชั่นขออาร์เรย์ numpy
chrisfs

ต่อไปนี้เป็นลิงก์ที่เกี่ยวข้องกับ dtypes และการจัดเรียงใหม่ (อาเรย์เรคคอร์ดหรืออาเรย์ที่มีโครงสร้าง): (1) stackoverflow.com/questions/9949427/ … (2) stackoverflow.com/questions/52579601/ …
JohnE

หมายเหตุ:การแปลง Pandas DataFrame เป็นอาเรย์ (หรือรายการ) เช่นนี้สามารถบ่งบอกถึงปัญหาอื่น ๆ ฉันขอแนะนำให้มั่นใจว่า DataFrame เป็นโครงสร้างข้อมูลที่เหมาะสมสำหรับกรณีการใช้งานเฉพาะของคุณและ Pandas ไม่ได้รวมวิธีการดำเนินการที่คุณสนใจ
AMC

คำตอบ:


391

หากต้องการแปลง dataframe แพนด้า (df) เป็น narry ndarray ให้ใช้รหัสนี้:

df.values

array([[nan, 0.2, nan],
       [nan, nan, 0.5],
       [nan, 0.2, 0.5],
       [0.1, 0.2, nan],
       [0.1, 0.2, 0.5],
       [0.1, nan, 0.5],
       [0.1, nan, nan]])

238

เลิกใช้งานvaluesและas_matrix() !

pandas v0.24.0 แนะนำวิธีการใหม่สองวิธีในการรับ NumPy arrays จาก pandas objects:

  1. to_numpy()ซึ่งกำหนดไว้ในIndex, Series,และDataFrameวัตถุและ
  2. arrayซึ่งถูกกำหนดไว้บนIndexและSeriesวัตถุเท่านั้น

หากคุณไปที่เอกสาร v0.24 .valuesคุณจะเห็นคำเตือนสีแดงขนาดใหญ่ที่ระบุว่า:

คำเตือน: เราแนะนำให้ใช้DataFrame.to_numpy()แทน

ดูส่วนนี้ของบันทึกประจำรุ่น v0.24.0และคำตอบนี้สำหรับข้อมูลเพิ่มเติม


สู่ความสอดคล้องที่ดีขึ้น: to_numpy()

ด้วยจิตวิญญาณของความสอดคล้องที่ดีขึ้นตลอดทั้ง API วิธีการใหม่to_numpyได้ถูกนำมาใช้เพื่อแยกอาร์เรย์ NumPy พื้นฐานจาก DataFrames

# Setup.
df = pd.DataFrame({'A': [1, 2, 3], 'B': [4, 5, 6]}, index=['a', 'b', 'c'])

df.to_numpy()
array([[1, 4],
       [2, 5],
       [3, 6]])

ดังกล่าวข้างต้นวิธีการนี้จะถูกกำหนดบนIndexและSeriesวัตถุ (ดูที่นี่ )

df.index.to_numpy()
# array(['a', 'b', 'c'], dtype=object)

df['A'].to_numpy()
#  array([1, 2, 3])

ตามค่าดีฟอลต์แล้วมุมมองจะถูกส่งคืนดังนั้นการแก้ไขใด ๆ ที่ทำจะมีผลกับต้นฉบับ

v = df.to_numpy()
v[0, 0] = -1

df
   A  B
a -1  4
b  2  5
c  3  6

หากคุณต้องการสำเนาให้ใช้to_numpy(copy=True)

pandas> = 1.0 การอัปเดตสำหรับ ExtensionTypes

หากคุณใช้แพนด้า 1.x โอกาสที่คุณจะได้รับการจัดการกับประเภทส่วนขยายจะมากขึ้น คุณจะต้องระวังให้มากขึ้นอีกเล็กน้อยว่าการแปลงประเภทส่วนขยายเหล่านี้ถูกต้องแล้ว

a = pd.array([1, 2, None], dtype="Int64")                                  
a                                                                          

<IntegerArray>
[1, 2, <NA>]
Length: 3, dtype: Int64 

# Wrong
a.to_numpy()                                                               
# array([1, 2, <NA>], dtype=object)  # yuck, objects

# Right
a.to_numpy(dtype='float', na_value=np.nan)                                 
# array([ 1.,  2., nan])

นี้จะเรียกว่าออกมาในเอกสาร

หากคุณต้องการdtypes...

ดังที่แสดงในคำตอบอื่นDataFrame.to_recordsเป็นวิธีที่ดีในการทำเช่นนี้

df.to_records()
# rec.array([('a', -1, 4), ('b',  2, 5), ('c',  3, 6)],
#           dtype=[('index', 'O'), ('A', '<i8'), ('B', '<i8')])

สิ่งนี้ไม่สามารถทำได้ด้วยto_numpyโชคไม่ดี อย่างไรก็ตามคุณสามารถใช้np.rec.fromrecords:

v = df.reset_index()
np.rec.fromrecords(v, names=v.columns.tolist())
# rec.array([('a', -1, 4), ('b',  2, 5), ('c',  3, 6)],
#          dtype=[('index', '<U1'), ('A', '<i8'), ('B', '<i8')])

ประสิทธิภาพการทำงานที่ชาญฉลาดมันเกือบจะเหมือนกัน (ที่จริงแล้วการใช้rec.fromrecordsเร็วกว่าเล็กน้อย)

df2 = pd.concat([df] * 10000)

%timeit df2.to_records()
%%timeit
v = df2.reset_index()
np.rec.fromrecords(v, names=v.columns.tolist())

11.1 ms ± 557 µs per loop (mean ± std. dev. of 7 runs, 100 loops each)
9.67 ms ± 126 µs per loop (mean ± std. dev. of 7 runs, 100 loops each)

เหตุผลในการเพิ่มวิธีการใหม่

to_numpy()(นอกเหนือจากarray) ถูกบันทึกเป็นผลมาจากการอภิปรายภายใต้สองประเด็น GitHub GH19954และGH23623

โดยเฉพาะเอกสารที่กล่าวถึงเหตุผล:

[... ] กับ.valuesมันไม่ชัดเจนว่าค่าที่ส่งคืนจะเป็นอาร์เรย์จริงการเปลี่ยนแปลงของมันบางส่วนหรือหนึ่งในอาร์เรย์ที่กำหนดเองของแพนด้า (เช่นCategorical) ตัวอย่างเช่นด้วยPeriodIndex, .values สร้างใหม่ndarrayของรอบระยะเวลาวัตถุในแต่ละครั้ง [ ... ]

to_numpyมุ่งมั่นที่จะปรับปรุงความสอดคล้องของ API ซึ่งเป็นก้าวสำคัญในทิศทางที่ถูกต้อง .valuesจะไม่เลิกใช้ในเวอร์ชันปัจจุบัน แต่ฉันคาดว่าจะเกิดขึ้นในอนาคตในอนาคตดังนั้นฉันจึงขอให้ผู้ใช้ย้ายไปยัง API ที่ใหม่กว่าโดยเร็วที่สุด


คำติชมของโซลูชั่นอื่น ๆ

DataFrame.values มีพฤติกรรมที่ไม่สอดคล้องกันดังที่ระบุไว้แล้ว

DataFrame.get_values()เป็นเพียงเสื้อคลุมรอบ ๆDataFrame.valuesดังนั้นทุกอย่างที่กล่าวไว้ข้างต้นจึงนำไปใช้

DataFrame.as_matrix()จะเลิกตอนนี้จะไม่ได้ใช้!


ฉันไม่เข้าใจว่ามันเป็นไปได้อย่างไรที่จะอ่านหน้าต่อจากหน้าหลังจากที่หน้าของผู้คนกรีดร้องที่ด้านบนสุดของปอดเพื่อเปลี่ยนจากas_matrixเป็นโซลูชันอื่นในกรณีนี้to_numpyโดยไม่อธิบายวิธีการกู้คืนคอลัมน์การเลือกฟังก์ชันของas_matrix! ฉันแน่ใจว่ามีวิธีอื่นในการเลือกคอลัมน์ แต่as_matrixมีอย่างน้อยหนึ่งคอลัมน์!
Jérémie

@ Jérémieนอกเหนือจากที่เห็นได้ชัด df[[col1, col2']].to_numpy() ? ไม่แน่ใจว่าทำไมคุณคิดว่าต้องการโฆษณาทางเลือกที่อัปเดตใหม่ให้กับฟังก์ชั่นที่เลิกใช้แล้วรับประกันว่าจะมีคำตอบสำหรับการลงคะแนน
cs95

อะไรถ้าบางคอลัมน์เป็นประเภทรายการ ฉันจะสร้างอาเรย์แบนเป็นหลุมเป็นบ่อจากนี้ได้อย่างไร
Moniba

@Moniba คุณอาจต้องการกระจายรายการเป็นคอลัมน์ / แถวแยกกันตามความต้องการของคุณก่อน
cs95

เว้นแต่ว่าฉันผิดการรับมากกว่าหนึ่งคอลัมน์ในการโทรเดียวกันจะทำให้ข้อมูลทั้งหมดถูกรวมเข้าเป็นหนึ่งอาร์เรย์ขนาดใหญ่ ฉันพลาดอะไรไปรึเปล่า?
Andrea Moro

128

หมายเหตุ : .as_matrix()วิธีการที่ใช้ในคำตอบนี้เลิกใช้แล้ว นุ่น 0.23.4 เตือน:

วิธีการ.as_matrixจะถูกลบในรุ่นอนาคต ใช้. value แทน


นุ่นมีบางอย่างที่สร้างขึ้นใน ...

numpy_matrix = df.as_matrix()

จะช่วยให้

array([[nan, 0.2, nan],
       [nan, nan, 0.5],
       [nan, 0.2, 0.5],
       [0.1, 0.2, nan],
       [0.1, 0.2, 0.5],
       [0.1, nan, 0.5],
       [0.1, nan, nan]])

30
นี้ไม่ได้ให้อาร์เรย์โครงสร้างคอลัมน์ทั้งหมดมี objectdtype
sebix

14
"เลิกใช้ตั้งแต่รุ่น 0.23.0: ใช้ DataFrame.values ​​แทน" / "วิธีนี้มีไว้สำหรับความเข้ากันได้แบบย้อนหลังโดยทั่วไปเราแนะนำให้ใช้ '.values'" - github.com/pandas-dev/pandas/blob/…
David J.

4
ตอนนี้เลิกใช้แล้ว ตั้งแต่ v0.24 เป็นต้นไปโปรดใช้to_numpyแทน (ไม่ใช่.valuesอย่างใดอย่างหนึ่ง) เพิ่มเติมที่นี่
cs95

1
"FutureWarning: เมธอด. as_matrix จะถูกลบในเวอร์ชันอนาคตให้ใช้. value แทน"
Farhad Maleki

66

ฉันจะโยงฟังก์ชัน DataFrame.reset_index ()และDataFrame.valuesเพื่อรับการแทนค่า Numpy ของ dataframe รวมถึงดัชนี:

In [8]: df
Out[8]: 
          A         B         C
0 -0.982726  0.150726  0.691625
1  0.617297 -0.471879  0.505547
2  0.417123 -1.356803 -1.013499
3 -0.166363 -0.957758  1.178659
4 -0.164103  0.074516 -0.674325
5 -0.340169 -0.293698  1.231791
6 -1.062825  0.556273  1.508058
7  0.959610  0.247539  0.091333

[8 rows x 3 columns]

In [9]: df.reset_index().values
Out[9]:
array([[ 0.        , -0.98272574,  0.150726  ,  0.69162512],
       [ 1.        ,  0.61729734, -0.47187926,  0.50554728],
       [ 2.        ,  0.4171228 , -1.35680324, -1.01349922],
       [ 3.        , -0.16636303, -0.95775849,  1.17865945],
       [ 4.        , -0.16410334,  0.0745164 , -0.67432474],
       [ 5.        , -0.34016865, -0.29369841,  1.23179064],
       [ 6.        , -1.06282542,  0.55627285,  1.50805754],
       [ 7.        ,  0.95961001,  0.24753911,  0.09133339]])

ในการรับ dtypes เราจำเป็นต้องแปลง ndarray นี้เป็นอาร์เรย์ที่มีโครงสร้างโดยใช้มุมมอง :

In [10]: df.reset_index().values.ravel().view(dtype=[('index', int), ('A', float), ('B', float), ('C', float)])
Out[10]:
array([( 0, -0.98272574,  0.150726  ,  0.69162512),
       ( 1,  0.61729734, -0.47187926,  0.50554728),
       ( 2,  0.4171228 , -1.35680324, -1.01349922),
       ( 3, -0.16636303, -0.95775849,  1.17865945),
       ( 4, -0.16410334,  0.0745164 , -0.67432474),
       ( 5, -0.34016865, -0.29369841,  1.23179064),
       ( 6, -1.06282542,  0.55627285,  1.50805754),
       ( 7,  0.95961001,  0.24753911,  0.09133339),
       dtype=[('index', '<i8'), ('A', '<f8'), ('B', '<f8'), ('C', '<f8')])

3
สิ่งเดียวที่ขาดหายไปในคำตอบนี้คือวิธีสร้าง dtype จาก data frame เพื่อให้คุณสามารถเขียนฟังก์ชันทั่วไป
Joseph Garvin

32

คุณสามารถใช้to_recordsวิธีการนี้ได้ แต่ต้องเล่นโดยใช้ dtypes เล็กน้อยหากไม่ใช่วิธีที่คุณต้องการตั้งแต่เริ่มต้น ในกรณีของฉันมีการคัดลอก DF ของคุณจากสตริงประเภทดัชนีเป็นสตริง (แสดงโดยobjectdtype ในนุ่น):

In [102]: df
Out[102]: 
label    A    B    C
ID                  
1      NaN  0.2  NaN
2      NaN  NaN  0.5
3      NaN  0.2  0.5
4      0.1  0.2  NaN
5      0.1  0.2  0.5
6      0.1  NaN  0.5
7      0.1  NaN  NaN

In [103]: df.index.dtype
Out[103]: dtype('object')
In [104]: df.to_records()
Out[104]: 
rec.array([(1, nan, 0.2, nan), (2, nan, nan, 0.5), (3, nan, 0.2, 0.5),
       (4, 0.1, 0.2, nan), (5, 0.1, 0.2, 0.5), (6, 0.1, nan, 0.5),
       (7, 0.1, nan, nan)], 
      dtype=[('index', '|O8'), ('A', '<f8'), ('B', '<f8'), ('C', '<f8')])
In [106]: df.to_records().dtype
Out[106]: dtype([('index', '|O8'), ('A', '<f8'), ('B', '<f8'), ('C', '<f8')])

การแปลงไฟล์ประเภท recarray ไม่เหมาะสำหรับฉัน แต่มีใครสามารถทำได้ใน Pandas แล้ว:

In [109]: df.index = df.index.astype('i8')
In [111]: df.to_records().view([('ID', '<i8'), ('A', '<f8'), ('B', '<f8'), ('C', '<f8')])
Out[111]:
rec.array([(1, nan, 0.2, nan), (2, nan, nan, 0.5), (3, nan, 0.2, 0.5),
       (4, 0.1, 0.2, nan), (5, 0.1, 0.2, 0.5), (6, 0.1, nan, 0.5),
       (7, 0.1, nan, nan)], 
      dtype=[('ID', '<i8'), ('A', '<f8'), ('B', '<f8'), ('C', '<f8')])

โปรดทราบว่า Pandas ไม่ได้ตั้งชื่อของดัชนีอย่างถูกต้อง (เป็น ID ) ในเร็กคอร์ดอาเรย์ที่ส่งออก (ข้อผิดพลาด?) ดังนั้นเราได้กำไรจากการแปลงรูปแบบเป็นค่าที่ถูกต้อง

ในขณะนี้ Pandas มีจำนวนเต็ม 8 ไบต์i8เท่านั้นและลอยตัวf8(ดูปัญหานี้)


2
ในการรับอาร์เรย์ที่มีโครงสร้างเป็นที่ต้องการ (ซึ่งมีประสิทธิภาพที่ดีกว่าการสร้างใหม่) คุณเพียงแค่ส่งผ่านการสร้างใหม่ไปยังตัวnp.arrayสร้าง
meteore

เราเพิ่งใส่ฟิกซ์สำหรับตั้งชื่อของดัชนีที่แสดงด้านบน
ช้างเธอ

26

ดูเหมือนว่าdf.to_records()จะทำงานให้คุณ สถานที่ที่คุณต้องการได้รับการร้องขอและto_recordsชี้ไปที่เป็นทางเลือก

ฉันลองใช้สิ่งนี้ในพื้นที่โดยใช้ตัวอย่างของคุณและการโทรนั้นให้ผลลัพธ์ที่คล้ายกับเอาต์พุตที่คุณต้องการ:

rec.array([(1, nan, 0.2, nan), (2, nan, nan, 0.5), (3, nan, 0.2, 0.5),
       (4, 0.1, 0.2, nan), (5, 0.1, 0.2, 0.5), (6, 0.1, nan, 0.5),
       (7, 0.1, nan, nan)],
      dtype=[(u'ID', '<i8'), (u'A', '<f8'), (u'B', '<f8'), (u'C', '<f8')])

โปรดทราบว่านี่เป็นมากกว่าrecarray arrayคุณสามารถย้ายผลในอาร์เรย์ numpy np.array(df.to_records())ปกติโดยการเรียกคอนสตรัคในฐานะที่เป็น


3
รอคำตอบนี้เพิ่มเมื่อเทียบกับคำตอบอื่น ๆ โดย @meteore ซึ่งกล่าวถึงto_records()เมื่อ 5 ปีก่อน?
JohnE

13

ลองสิ่งนี้:

a = numpy.asarray(df)

Hi! โปรดเพิ่มคำอธิบายลงในคำตอบของคุณ ตอนนี้กำลังถูกทำเครื่องหมายว่ามีคุณภาพต่ำโดยการตรวจสอบเนื่องจากความยาวและเนื้อหาและมีความเสี่ยงที่ระบบจะถูกลบ ขอบคุณ!
d_kennetz

1
โดยทั่วไปจะแปลงอินพุตเป็นอาเรย์ (ตามชื่อแนะนำ) ดังนั้นพร้อมกับบริบทของคำถามคำตอบนี้ถูกต้อง ตรวจสอบdocs.scipy.org/doc/numpy/reference/generated/…
Lautaro Parada Opazo

ขอบคุณฉันคิดว่ามันอธิบายได้ด้วยตนเอง
Dadu Khan

8

นี่คือวิธีของฉันในการสร้างอาร์เรย์โครงสร้างจาก DataFrame แพนด้า

สร้างกรอบข้อมูล

import pandas as pd
import numpy as np
import six

NaN = float('nan')
ID = [1, 2, 3, 4, 5, 6, 7]
A = [NaN, NaN, NaN, 0.1, 0.1, 0.1, 0.1]
B = [0.2, NaN, 0.2, 0.2, 0.2, NaN, NaN]
C = [NaN, 0.5, 0.5, NaN, 0.5, 0.5, NaN]
columns = {'A':A, 'B':B, 'C':C}
df = pd.DataFrame(columns, index=ID)
df.index.name = 'ID'
print(df)

      A    B    C
ID               
1   NaN  0.2  NaN
2   NaN  NaN  0.5
3   NaN  0.2  0.5
4   0.1  0.2  NaN
5   0.1  0.2  0.5
6   0.1  NaN  0.5
7   0.1  NaN  NaN

กำหนดฟังก์ชั่นเพื่อสร้างอาร์เรย์โครงสร้างแบบ numpy (ไม่ใช่อาร์เรย์เรคคอร์ด) จาก pandas DataFrame

def df_to_sarray(df):
    """
    Convert a pandas DataFrame object to a numpy structured array.
    This is functionally equivalent to but more efficient than
    np.array(df.to_array())

    :param df: the data frame to convert
    :return: a numpy structured array representation of df
    """

    v = df.values
    cols = df.columns

    if six.PY2:  # python 2 needs .encode() but 3 does not
        types = [(cols[i].encode(), df[k].dtype.type) for (i, k) in enumerate(cols)]
    else:
        types = [(cols[i], df[k].dtype.type) for (i, k) in enumerate(cols)]
    dtype = np.dtype(types)
    z = np.zeros(v.shape[0], dtype)
    for (i, k) in enumerate(z.dtype.names):
        z[k] = v[:, i]
    return z

ใช้reset_indexเพื่อสร้าง data frame ใหม่ที่รวมดัชนีเป็นส่วนหนึ่งของข้อมูล แปลงเฟรมข้อมูลนั้นเป็นอาร์เรย์โครงสร้าง

sa = df_to_sarray(df.reset_index())
sa

array([(1L, nan, 0.2, nan), (2L, nan, nan, 0.5), (3L, nan, 0.2, 0.5),
       (4L, 0.1, 0.2, nan), (5L, 0.1, 0.2, 0.5), (6L, 0.1, nan, 0.5),
       (7L, 0.1, nan, nan)], 
      dtype=[('ID', '<i8'), ('A', '<f8'), ('B', '<f8'), ('C', '<f8')])

แก้ไข: อัปเดต df_to_sarray เพื่อหลีกเลี่ยงข้อผิดพลาดในการเรียก. encode () ด้วย python 3 ขอบคุณJoseph Garvinและhalcyon สำหรับความคิดเห็นและการแก้ปัญหาของพวกเขา


ใช้งานไม่ได้สำหรับฉันข้อผิดพลาด: TypeError: ไม่เข้าใจชนิดข้อมูล
Joseph Garvin

ขอบคุณสำหรับความคิดเห็นของคุณและเงียบสงบสำหรับการแก้ไข ฉันอัปเดตคำตอบแล้วฉันหวังว่าจะได้ผลสำหรับคุณในตอนนี้
Phil


5

วิธีที่ง่ายกว่าสำหรับ DataFrame ตัวอย่าง:

df

         gbm       nnet        reg
0  12.097439  12.047437  12.100953
1  12.109811  12.070209  12.095288
2  11.720734  11.622139  11.740523
3  11.824557  11.926414  11.926527
4  11.800868  11.727730  11.729737
5  12.490984  12.502440  12.530894

ใช้:

np.array(df.to_records().view(type=np.matrix))

ได้รับ:

array([[(0, 12.097439  , 12.047437, 12.10095324),
        (1, 12.10981081, 12.070209, 12.09528824),
        (2, 11.72073428, 11.622139, 11.74052253),
        (3, 11.82455653, 11.926414, 11.92652727),
        (4, 11.80086775, 11.72773 , 11.72973699),
        (5, 12.49098389, 12.50244 , 12.53089367)]],
dtype=(numpy.record, [('index', '<i8'), ('gbm', '<f8'), ('nnet', '<f4'),
       ('reg', '<f8')]))

4

เพิ่งมีปัญหาที่คล้ายกันเมื่อส่งออกจาก dataframe ไปยังตาราง arcgis และสะดุดในการแก้ปัญหาจาก usgs ( https://my.usgs.gov/confluence/display/cdi/pandas.DataFrame+to+ArcGIS+Table ) ในระยะสั้นปัญหาของคุณมีวิธีแก้ไขปัญหาที่คล้ายกัน:

df

      A    B    C
ID               
1   NaN  0.2  NaN
2   NaN  NaN  0.5
3   NaN  0.2  0.5
4   0.1  0.2  NaN
5   0.1  0.2  0.5
6   0.1  NaN  0.5
7   0.1  NaN  NaN

np_data = np.array(np.rec.fromrecords(df.values))
np_names = df.dtypes.index.tolist()
np_data.dtype.names = tuple([name.encode('UTF8') for name in np_names])

np_data

array([( nan,  0.2,  nan), ( nan,  nan,  0.5), ( nan,  0.2,  0.5),
       ( 0.1,  0.2,  nan), ( 0.1,  0.2,  0.5), ( 0.1,  nan,  0.5),
       ( 0.1,  nan,  nan)], 
      dtype=(numpy.record, [('A', '<f8'), ('B', '<f8'), ('C', '<f8')]))

4

ฉันได้รับคำตอบข้างต้น วิธีการ " as_matrix () " ใช้งานได้ แต่ล้าสมัยแล้วในตอนนี้ สำหรับฉันการทำงานคือ " .to_numpy () "

สิ่งนี้จะส่งกลับอาร์เรย์แบบหลายมิติ ฉันต้องการใช้วิธีนี้หากคุณกำลังอ่านข้อมูลจากแผ่นงาน excel และคุณจำเป็นต้องเข้าถึงข้อมูลจากดัชนีใด ๆ หวังว่าจะช่วย :)


คุณหมายถึงอะไรโดยและคุณจำเป็นต้องเข้าถึงข้อมูลจากดัชนีใด ? ขึ้นอยู่กับลักษณะของข้อมูลของคุณ Pandas DataFrame อาจไม่ใช่ตัวเลือกที่ถูกต้องตั้งแต่แรก
AMC

2

นอกจากคำตอบของ meteore ฉันพบรหัส

df.index = df.index.astype('i8')

ไม่ได้ผลสำหรับฉัน ดังนั้นฉันจึงใส่รหัสที่นี่เพื่อความสะดวกของผู้อื่นที่ติดอยู่กับปัญหานี้

city_cluster_df = pd.read_csv(text_filepath, encoding='utf-8')
# the field 'city_en' is a string, when converted to Numpy array, it will be an object
city_cluster_arr = city_cluster_df[['city_en','lat','lon','cluster','cluster_filtered']].to_records()
descr=city_cluster_arr.dtype.descr
# change the field 'city_en' to string type (the index for 'city_en' here is 1 because before the field is the row index of dataframe)
descr[1]=(descr[1][0], "S20")
newArr=city_cluster_arr.astype(np.dtype(descr))

1

วิธีง่ายๆในการแปลงดาต้าเฟรมให้เป็นอาร์เรย์ที่มีค่า:

import pandas as pd
df = pd.DataFrame({"A": [1, 2], "B": [3, 4]})
df_to_array = df.to_numpy()
array([[1, 3],
   [2, 4]])

การใช้ to_numpy ได้รับการสนับสนุนเพื่อรักษาความมั่นคง

การอ้างอิง: https://pandas.pydata.org/pandas-docs/stable/reference/api/pandas.DataFrame.to_numpy.html


อะไรคือข้อแตกต่างระหว่าง Arsam กับโซลูชั่นของคุณ ...
qaiser

แค่พยายามทำให้มันสมบูรณ์มากขึ้นและใช้งานได้ด้วยตัวอย่างโค้ดซึ่งเป็นสิ่งที่ฉันชอบเป็นการส่วนตัว
user1460675

1

ลองสิ่งนี้:

np.array(df) 

array([['ID', nan, nan, nan],
   ['1', nan, 0.2, nan],
   ['2', nan, nan, 0.5],
   ['3', nan, 0.2, 0.5],
   ['4', 0.1, 0.2, nan],
   ['5', 0.1, 0.2, 0.5],
   ['6', 0.1, nan, 0.5],
   ['7', 0.1, nan, nan]], dtype=object)

ข้อมูลเพิ่มเติมได้ที่: [ https://docs.scipy.org/doc/numpy/reference/generated/numpy.array.html] ใช้ได้สำหรับ numpy 1.16.5 และ pandas 0.25.2

โดยการใช้ไซต์ของเรา หมายความว่าคุณได้อ่านและทำความเข้าใจนโยบายคุกกี้และนโยบายความเป็นส่วนตัวของเราแล้ว
Licensed under cc by-sa 3.0 with attribution required.