ฉันจะแปลงชุดแพนด้าหรือดัชนีเป็นอาร์เรย์ Numpy ได้อย่างไร


264

คุณรู้วิธีรับดัชนีหรือคอลัมน์ของ DataFrame เป็นรายการ NumPy หรือรายการหลามหรือไม่



นี่ตอบคำถามของคุณหรือไม่? แปลง Panda DataFrame เป็น NumPy array
AMC

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

คำตอบ:


353

ในการรับอาร์เรย์ NumPy คุณควรใช้valuesแอตทริบิวต์:

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

In [2]: df.index.values
Out[2]: array(['a', 'b', 'c'], dtype=object)

วิธีนี้จะเข้าถึงวิธีจัดเก็บข้อมูลอยู่แล้วดังนั้นจึงไม่จำเป็นต้องมีการแปลง
หมายเหตุ: แอททริบิวนี้มีให้สำหรับวัตถุแพนด้าอื่น ๆ อีกมากมาย

In [3]: df['A'].values
Out[3]: Out[16]: array([1, 2, 3])

ในการรับดัชนีเป็นรายการโทรtolist:

In [4]: df.index.tolist()
Out[4]: ['a', 'b', 'c']

และในทำนองเดียวกันสำหรับคอลัมน์


หมายเหตุ: .valuesเลิกใช้แล้ว.to_numpy()เป็นการแทนที่ที่แนะนำถ้าคุณต้องการอาร์เรย์ NumPy คุณสามารถขยายการเข้าถึงวิธีนี้ข้อมูลถูกเก็บไว้แล้วจึงไม่จำเป็นต้องมีการแปลง ?
AMC

คำตอบโดย cs95ให้คำอธิบายที่ดีของ.values, และ.to_numpy() .array
AMC

75

คุณสามารถใช้ในการเข้าถึงวัตถุดัชนีและจากนั้นได้รับค่าในรายการโดยใช้df.index df.index.tolist()ในทำนองเดียวกันคุณสามารถใช้df['col'].tolist()สำหรับซีรี่ส์


มันจะส่งคืนอินสแตนซ์วิธีและไม่ใช่อาร์เรย์ของรายการ
V Shreyas

12
@VShreyas เป็นไงบ้างdf.index.values.tolist()
LancelotHolmes

3
df.index.tolist()ไม่ส่งคืนเมธอดอินสแตนซ์ มันจะส่งคืนรายการดัชนี มันเป็นวิธีการที่กำหนดไว้ในดัชนีแพนด้า ในขณะที่เรียกค่าแรกคือความเป็นไปได้การมอบหมายงานให้กับ numpy ไม่ใช่การแก้ไข - เป็นทางเลือก
ayhan

51

แพนด้า> = 0.24

เลิกใช้งานของคุณ.valuesในความโปรดปรานของวิธีการเหล่านี้!

จาก v0.24.0 เป็นต้นไปเราจะมีสองตบแบรนด์ใหม่วิธีการที่แนะนำสำหรับการได้รับอาร์เรย์ NumPy จากIndex, SeriesและDataFrameวัตถุที่พวกเขามีและto_numpy() .arrayเกี่ยวกับการใช้งานเอกสารกล่าวถึง:

เราไม่ได้ลบหรือเลิกใช้งานSeries.valuesหรือ DataFrame.valuesแต่เราขอแนะนำและใช้.arrayหรือ .to_numpy()แทน

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


to_numpy() วิธี

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

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

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

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

df
    A  B
-1  1  2
b   4  5

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

v = df.index.to_numpy(copy=True)
v[-1] = -123

df
   A  B
a  1  2
b  4  5

โปรดทราบว่าฟังก์ชั่นนี้ใช้ได้กับDataFrames ด้วย (ในขณะที่ใช้.arrayไม่ได้)


arrayแอตทริบิวต์แอตทริบิวต์
นี้ส่งคืนExtensionArrayวัตถุที่อยู่ด้านหลังดัชนี / ซีรี่ส์

pd.__version__
# '0.24.0rc1'

# Setup.
df = pd.DataFrame([[1, 2], [4, 5]], columns=['A', 'B'], index=['a', 'b'])
df

   A  B
a  1  2
b  4  5

df.index.array    
# <PandasArray>
# ['a', 'b']
# Length: 2, dtype: object

df['A'].array
# <PandasArray>
# [1, 4]
# Length: 2, dtype: int64

จากที่นี่เป็นไปได้ที่จะได้รับรายการโดยใช้list:

list(df.index.array)
# ['a', 'b']

list(df['A'].array)
# [1, 4]

หรือโทรโดยตรง.tolist():

df.index.tolist()
# ['a', 'b']

df['A'].tolist()
# [1, 4]

เกี่ยวกับสิ่งที่ส่งคืนเอกสารกล่าวถึง

สำหรับSeriesและIndexES รับการสนับสนุนจากอาร์เรย์ NumPy ปกติSeries.array จะกลับมาใหม่arrays.PandasArrayซึ่งเป็นบาง (ไม่มีสำเนา) numpy.ndarrayเสื้อคลุมรอบ arrays.PandasArrayไม่ได้มีประโยชน์เป็นพิเศษในตัวมันเอง แต่มันให้อินเทอร์เฟซเดียวกับส่วนขยายใด ๆ ที่กำหนดไว้ในแพนด้าหรือห้องสมุดบุคคลที่สาม

ดังนั้นเพื่อสรุป.arrayจะกลับมาทั้ง

  1. การExtensionArrayสำรองข้อมูลดัชนี / ซีรี่ส์ที่มีอยู่หรือ
  2. หากมีอาร์เรย์ NumPy ที่สนับสนุนชุดExtensionArrayวัตถุใหม่จะถูกสร้างขึ้นเป็น wrapper ที่บางกว่าอาร์เรย์ที่อยู่ข้างใต้

เหตุผลในการเพิ่มสองวิธีการใหม่
ฟังก์ชั่นเหล่านี้ได้ถูกเพิ่มเป็นผลจากการอภิปรายภายใต้สองประเด็น GitHub GH19954และGH23623

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

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

ฟังก์ชันทั้งสองนี้มีจุดประสงค์เพื่อปรับปรุงความสอดคล้องของ API ซึ่งเป็นขั้นตอนหลักในทิศทางที่ถูกต้อง

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


48

หากคุณกำลังจัดการกับ dataframe หลายดัชนีคุณอาจสนใจที่จะแยกคอลัมน์ของชื่อเดียวของ multi-index คุณสามารถทำสิ่งนี้เป็น

df.index.get_level_values('name_sub_index')

และแน่นอนname_sub_indexจะต้องเป็นองค์ประกอบของFrozenList df.index.names


16

ตั้งแต่ pandas v0.13 คุณสามารถใช้get_values:

df.index.get_values()

5
มีความแตกต่างระหว่างสิ่งนี้กับค่าหรือไม่ (ฉันอัปเดตข้อมูลรุ่นเนื่องจากฟังก์ชั่นนี้ปรากฏขึ้นจากเอกสาร 0.13.0)
Andy Hayden

@Andy Hayden: ความแตกต่างอย่างใดอย่างหนึ่งที่. get_values ​​เป็นวิธีที่เป็นทางการในการรับเฉพาะค่าปัจจุบันในขณะที่. value (เช่นในหลายดัชนี) อาจส่งคืนค่าดัชนีที่แถวหรือคอลัมน์ถูกลบไปแล้วหรือไม่?
Ezekiel Kruglick

@EzekielKruglick ดังนั้นจึงเป็นสำเนาอยู่เสมอ การเชื่อมโยงไปยังเอกสารมีน้ำหนักเบามากฉันไม่คิดว่าคุณจะถูกหลอกแบบนั้น (แม้ว่าพวกเขาจะอยู่ใน MI พวกเขาจะไม่ได้อยู่ในค่า.) จะดีมากที่ได้เห็นตัวอย่างที่แสดงถึงสิ่งนี้!
Andy Hayden

@ AndyHayden: ฉันคิดว่าฉันอ่านความคิดเห็นของคุณผิด คุณพูดถูก. ค่าดี. ระดับให้ล้าสมัยและ get_values ​​ให้ค่าปัจจุบันอย่างถูกต้องไม่รวมแถว / คอลัมน์ที่ถูกทิ้ง ปัญหา github ดั้งเดิม: github.com/pydata/pandas/issues/3686 แต่ฉันเพิ่งตรวจสอบและดูเหมือนว่าค่า (แน่นอน!) ให้ข้อมูลที่ทันสมัยในรูปแบบที่แตกต่างจากที่ฉันคิดว่าเป็นสิ่งที่เรากำลังพูดถึง
Ezekiel Kruglick

1
@AndyHayden ไม่ไม่มีความแตกต่าง โทรเพียงget_values .valuesมันเป็นตัวอักษรมากขึ้นในการพิมพ์
cs95

0

ผมแปลงหมีแพนด้าdataframeไปแล้วใช้ขั้นพื้นฐานlist list.index()บางสิ่งเช่นนี้

dd = list(zone[0]) #Where zone[0] is some specific column of the table
idx = dd.index(filename[i])

idxคุณมีคุณค่าดัชนีเป็น


แล้วใช้ลิสต์พื้นฐาน list.index ()เกี่ยวข้องกับคำถามของการแปลงซีรีส์เป็นรายการได้อย่างไร
AMC

0

วิธีล่าสุดในการทำเช่นนี้คือการใช้ฟังก์ชัน. to_numpy ()

ถ้าฉันมีชื่อไฟล์ที่มีคอลัมน์ 'ราคา' ฉันสามารถแปลงได้ดังนี้:

priceArray = df['price'].to_numpy()

นอกจากนี้คุณยังสามารถส่งชนิดข้อมูลเช่น float หรือวัตถุเป็นอาร์กิวเมนต์ของฟังก์ชัน


-1

ด้านล่างเป็นวิธีง่าย ๆ ในการแปลงคอลัมน์ dataframe ให้เป็นอาร์เรย์แบบ numpy

df = pd.DataFrame(somedict) 
ytrain = df['label']
ytrain_numpy = np.array([x for x in ytrain['label']])

ytrain_numpy เป็นอาร์เรย์ numpy

ฉันลองด้วยto.numpy()แต่มันทำให้ฉันมีข้อผิดพลาดด้านล่าง: TypeError: ไม่รองรับการแปลงสำหรับประเภท: (dtype ('O'),)ในขณะที่กำลังทำการจำแนกประเภทความเกี่ยวข้องแบบไบนารีโดยใช้ Linear SVC to.numpy () กำลังแปลง dataFrame ไปเป็น numpy array แต่ชนิดข้อมูลขององค์ประกอบภายในเป็นรายการเนื่องจากข้อผิดพลาดดังกล่าวถูกตรวจพบ


ฉันพยายามด้วย to.numpy () แต่มันทำให้ฉันมีข้อผิดพลาดด้านล่าง: TypeError: ไม่มีการแปลงที่รองรับสำหรับประเภท: (dtype ('O'),) ในขณะที่กำลังทำการจำแนก class Bication โดยใช้ Linear SVC to.numpy () กำลังแปลง dataFrame ไปเป็น numpy array แต่ชนิดข้อมูลขององค์ประกอบภายในเป็นรายการเนื่องจากข้อผิดพลาดดังกล่าวถูกตรวจพบ นั่นคือไม่ได้จริงๆความผิดของto_numpyแต่
AMC
โดยการใช้ไซต์ของเรา หมายความว่าคุณได้อ่านและทำความเข้าใจนโยบายคุกกี้และนโยบายความเป็นส่วนตัวของเราแล้ว
Licensed under cc by-sa 3.0 with attribution required.