เลิกใช้งานvalues
และas_matrix()
!
pandas v0.24.0 แนะนำวิธีการใหม่สองวิธีในการรับ NumPy arrays จาก pandas objects:
to_numpy()
ซึ่งกำหนดไว้ในIndex
, Series,
และDataFrame
วัตถุและ
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()
จะเลิกตอนนี้จะไม่ได้ใช้!