การเลือกแถวของชุดข้อมูล / ดาต้าฟอร์มโดยดัชนีจำนวนเต็ม


395

ฉันอยากรู้ว่าทำไม df[2]ไม่ได้รับการสนับสนุนในขณะที่df.ix[2]และdf[2:3]ทั้งสองทำงาน

In [26]: df.ix[2]
Out[26]: 
A    1.027680
B    1.514210
C   -1.466963
D   -0.162339
Name: 2000-01-03 00:00:00

In [27]: df[2:3]
Out[27]: 
                  A        B         C         D
2000-01-03  1.02768  1.51421 -1.466963 -0.162339

ฉันคาดว่าdf[2]จะทำงานแบบเดียวกับdf[2:3]ที่สอดคล้องกับข้อตกลงการจัดทำดัชนีของ Python มีเหตุผลในการออกแบบที่ไม่สนับสนุนการทำดัชนีแถวด้วยจำนวนเต็มเดียวหรือไม่?


4
df.ix[2]ไม่ทำงาน - อย่างน้อยไม่ได้อยู่ในpandas version '0.19.2'
Zahra

9
เห็นความแตกต่างระหว่างแถวและคอลัมน์เลือกผ่านทางผู้ประกอบการจัดทำดัชนีที่[], ดูคำตอบด้านล่างนี้ นอกจากนี้ยังไม่เคยใช้.ixมันเลิกใช้แล้ว
Ted Petrou

คำตอบ:


551

echoing @HYRY ดูเอกสารใหม่ใน 0.11

http://pandas.pydata.org/pandas-docs/stable/indexing.html

ที่นี่เรามีผู้ประกอบการใหม่.ilocเพื่อสนับสนุนการสร้างดัชนี Explicity เฉพาะจำนวนเต็มและ.locเพื่อรองรับการสร้างดัชนีฉลากเท่านั้น

เช่นนึกภาพเหตุการณ์นี้

In [1]: df = pd.DataFrame(np.random.rand(5,2),index=range(0,10,2),columns=list('AB'))

In [2]: df
Out[2]: 
          A         B
0  1.068932 -0.794307
2 -0.470056  1.192211
4 -0.284561  0.756029
6  1.037563 -0.267820
8 -0.538478 -0.800654

In [5]: df.iloc[[2]]
Out[5]: 
          A         B
4 -0.284561  0.756029

In [6]: df.loc[[2]]
Out[6]: 
          A         B
2 -0.470056  1.192211

[] แบ่งแถว (ตามตำแหน่งฉลาก) เท่านั้น


7
ถ้าคุณต้องการแถวที่ 2 และ 3 และแถวที่ 4
FaCoffee

1
คุณสามารถผ่านรายการของตัวทำดัชนี; เอกสารชี้ไปที่ด้านบน
Jeff

2
ไม่มีใครมีเหตุผลสำหรับชื่อเหล่านี้หรือไม่ ฉันพบว่ามันยากที่จะจำได้เพราะฉันไม่แน่ใจว่าทำไมilocเป็นแถวและlocป้ายกำกับ
kilojoules

3
@kilojoules .ilocค้นหาสิ่งต่าง ๆ ตามคำสั่งของพวกเขาในดัชนี (เช่น.iloc[[2]]) คือ "แถว" ที่dfสอง แถวที่เกิดขึ้นที่จะเป็นดัชนี4ที่ตั้ง .locค้นหาโดยใช้ค่าดัชนีของพวกเขา ดังนั้นบางที "iloc" ก็เหมือนกับ "i" เหมือนในA[i]? :)
Jim K.

1
@Jeff - มันใช้งานได้ดี แต่จะเกิดอะไรขึ้นเมื่อคุณต้องการทำสำเนาแถวจาก data frame เช่นdf.loc[-1] = df.iloc[[0]]และแทรกเข้าไป เฟรมมาพร้อมกับคอลัมน์ดัชนีเพิ่มเติมที่ให้ข้อผิดพลาดValueError: cannot set a row with mismatched columns (ดูstackoverflow.com/questions/47340571/… )
Growler

63

วัตถุประสงค์หลักของโอเปอเรเตอร์ DataFrame []คือการเลือกคอลัมน์

เมื่อโอเปอเรเตอร์การทำดัชนีถูกส่งผ่านสตริงหรือจำนวนเต็มมันจะพยายามค้นหาคอลัมน์ที่มีชื่อเฉพาะนั้นและส่งกลับเป็นซีรีย์

ดังนั้นในคำถามข้างต้น: การค้นหาชื่อคอลัมน์ที่ตรงกับค่าจำนวนเต็มdf[2] 2คอลัมน์นี้ไม่มีอยู่และ a KeyErrorถูกยกขึ้น


ตัวดำเนินการการจัดทำดัชนี DataFrame เปลี่ยนพฤติกรรมการเลือกแถวอย่างสมบูรณ์เมื่อมีการใช้สัญกรณ์สไลซ์

อย่างน่าประหลาดใจเมื่อได้รับส่วนแบ่งผู้ดำเนินการทำดัชนี DataFrame จะเลือกแถวและสามารถทำได้โดยใช้ตำแหน่งจำนวนเต็มหรือตามป้ายกำกับดัชนี

df[2:3]

สิ่งนี้จะเริ่มต้นจากแถวที่มีที่ตั้งจำนวนเต็ม 2 ถึง 3 ซึ่งไม่รวมองค์ประกอบสุดท้าย ดังนั้นแค่แถวเดียว ต่อไปนี้เลือกแถวที่เริ่มต้นที่ตำแหน่งจำนวนเต็ม 6 ถึง แต่ไม่รวม 20 โดยทุกแถวที่สาม

df[6:20:3]

คุณยังสามารถใช้ชิ้นส่วนที่ประกอบด้วยป้ายชื่อสตริงหากดัชนี DataFrame ของคุณมีสตริงอยู่ สำหรับรายละเอียดเพิ่มเติมโปรดดูที่การแก้ปัญหานี้ใน .iloc VS .loc

ฉันแทบไม่เคยใช้สัญกรณ์ชิ้นนี้กับตัวดำเนินการจัดทำดัชนีเนื่องจากไม่ชัดเจนและแทบจะไม่เคยใช้เลย .loc/.ilocเมื่อหั่นด้วยแถวติดกับ


กำลังพยายามเพิ่มแถวไปยังอีก dataframe โดยใช้ตัวดำเนินการ indxeing แต่ dataframe อื่นยังคงว่างเปล่า ทำไม?
FindOutIslamNow

23

คุณสามารถคิดว่า DataFrame เป็น dict of Series df[key]ลองเลือกดัชนีคอลัมน์โดยkeyและส่งคืนวัตถุซีรี่ส์

อย่างไรก็ตามการแบ่งส่วนภายในของ [] แบ่งส่วนแถวเนื่องจากเป็นการดำเนินการทั่วไป

คุณสามารถอ่านเอกสารเพื่อรับรายละเอียด:

http://pandas.pydata.org/pandas-docs/stable/indexing.html#basics


ขอบคุณสำหรับคำใบ้ ตลกสิ่งนี้เป็นสิ่งที่ยังคงทำให้เกิดคำถามนุ่นอยู่ตลอดเวลา การเพิ่มข้อยกเว้นให้กับพฤติกรรมในบางสถานการณ์ .. สำหรับฉันมันรู้สึกเหมือนเป็นการเสียสละความมั่นคงเพื่อความสะดวกสบายเล็กน้อย
Carl Berger

15

ในการเข้าถึงดัชนีแบบอิงดัชนีไปยังตารางหมีแพนด้าคุณสามารถพิจารณาตัวเลือกnumpy.as_arrayเพื่อแปลงตารางเป็น Numpy array ได้

np_df = df.as_matrix()

แล้ว

np_df[i] 

จะทำงาน.


11
ที่เอาชนะจุดประสงค์ทั้งหมดของดัชนีข้อมูลและทุกอย่างที่แพนด้าเสนอ
Fábio Dias

6

คุณสามารถดูรหัสที่มา

DataFrameมีฟังก์ชั่นส่วนตัว_slice()เพื่อฝานDataFrameและช่วยให้พารามิเตอร์axisในการกำหนดแกนที่จะฝาน __getitem__()สำหรับไม่ได้กำหนดแกนในขณะที่กล่าวอ้างDataFrame _slice()ดังนั้น_slice()แบ่งมันตามแกนเริ่มต้น 0

คุณสามารถทำการทดลองง่าย ๆ ที่อาจช่วยคุณ:

print df._slice(slice(0, 2))
print df._slice(slice(0, 2), 0)
print df._slice(slice(0, 2), 1)

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