วิธีรับ N แถวสุดท้ายของ DataFrame แพนด้า?


175

ฉันมีดาต้าดาต้าแพนด้าdf1และdf2(df1 คือ vanila dataframe, df2 ถูกจัดทำดัชนีโดย 'STK_ID' & 'RPT_Date'):

>>> df1
    STK_ID  RPT_Date  TClose   sales  discount
0   000568  20060331    3.69   5.975       NaN
1   000568  20060630    9.14  10.143       NaN
2   000568  20060930    9.49  13.854       NaN
3   000568  20061231   15.84  19.262       NaN
4   000568  20070331   17.00   6.803       NaN
5   000568  20070630   26.31  12.940       NaN
6   000568  20070930   39.12  19.977       NaN
7   000568  20071231   45.94  29.269       NaN
8   000568  20080331   38.75  12.668       NaN
9   000568  20080630   30.09  21.102       NaN
10  000568  20080930   26.00  30.769       NaN

>>> df2
                 TClose   sales  discount  net_sales    cogs
STK_ID RPT_Date                                             
000568 20060331    3.69   5.975       NaN      5.975   2.591
       20060630    9.14  10.143       NaN     10.143   4.363
       20060930    9.49  13.854       NaN     13.854   5.901
       20061231   15.84  19.262       NaN     19.262   8.407
       20070331   17.00   6.803       NaN      6.803   2.815
       20070630   26.31  12.940       NaN     12.940   5.418
       20070930   39.12  19.977       NaN     19.977   8.452
       20071231   45.94  29.269       NaN     29.269  12.606
       20080331   38.75  12.668       NaN     12.668   3.958
       20080630   30.09  21.102       NaN     21.102   7.431

ฉันสามารถรับ df2 3 แถวสุดท้ายโดย:

>>> df2.ix[-3:]
                 TClose   sales  discount  net_sales    cogs
STK_ID RPT_Date                                             
000568 20071231   45.94  29.269       NaN     29.269  12.606
       20080331   38.75  12.668       NaN     12.668   3.958
       20080630   30.09  21.102       NaN     21.102   7.431

ในขณะที่df1.ix[-3:]ให้แถวทั้งหมด:

>>> df1.ix[-3:]
    STK_ID  RPT_Date  TClose   sales  discount
0   000568  20060331    3.69   5.975       NaN
1   000568  20060630    9.14  10.143       NaN
2   000568  20060930    9.49  13.854       NaN
3   000568  20061231   15.84  19.262       NaN
4   000568  20070331   17.00   6.803       NaN
5   000568  20070630   26.31  12.940       NaN
6   000568  20070930   39.12  19.977       NaN
7   000568  20071231   45.94  29.269       NaN
8   000568  20080331   38.75  12.668       NaN
9   000568  20080630   30.09  21.102       NaN
10  000568  20080930   26.00  30.769       NaN

ทำไม วิธีรับ 3 แถวสุดท้ายdf1(dataframe ที่ไม่มีดัชนี) นุ่น 0.10.1


3
คุณสามารถใช้df[-3:]เพื่อสร้างผลลัพธ์ที่คุณต้องการ สิ่งนี้ได้รับการแก้ไขเป็นข้อบกพร่องโดย WesM ไม่แน่ใจว่า / เมื่อได้รับการแก้ไขแล้ว: stackoverflow.com/questions/14035817/ …
Zelazny7

@ Zelazny7 ฉันไม่คิดว่าถูกต้อง ฉันคิดว่าการแบ่งส่วนเชิงลบด้วยixเป็นข้อบกพร่อง แต่การส่งผ่านชิ้นส่วนเชิงลบไป__getitem__ไม่ใช่ df.iloc[-3:]มอบหมายภายในให้__getitem__กับอาร์กิวเมนต์เดียวกัน do df[-3:]เป็นทางลัดสำหรับdf.iloc[-3:]ไม่ใช่ข้อบกพร่อง
cs95

คำตอบ:



74

นี่เป็นเพราะการใช้ดัชนีจำนวนเต็ม ( ixเลือกโดยใช้ป้ายกำกับมากกว่า -3 มากกว่าตำแหน่งและนี่คือโดยการออกแบบ: ดูการจัดทำดัชนีจำนวนเต็มใน pandas "gotchas" *)

* ในเวอร์ชันที่ใหม่กว่าของ pandas ต้องการ loc หรือ iloc เพื่อลบความคลุมเครือของ ix เป็นตำแหน่งหรือฉลาก:

df.iloc[-3:]

ดูเอกสาร

Wes ชี้ให้เห็นว่าในกรณีนี้คุณควรใช้หาง!


1
@DavidWolever ฉันไม่สามารถสร้าง IndexError ของคุณอีกครั้งใน 0.14.1, df.iloc [-5:] ทำงานได้ดีสำหรับฉันด้วยตัวอย่างของคุณ คุณใช้แพนด้าเวอร์ชันไหน
Andy Hayden

10

วิธีรับ N แถวสุดท้ายของ DataFrame แพนด้า?

หากคุณแบ่งตามตำแหน่ง__getitem__(เช่นการแบ่งส่วนด้วย[]) ทำงานได้ดีและเป็นคำตอบที่สั้นที่สุดที่ฉันพบสำหรับปัญหานี้

pd.__version__
# '0.24.2'

df = pd.DataFrame({'A': list('aaabbbbc'), 'B': np.arange(1, 9)})
df

   A  B
0  a  1
1  a  2
2  a  3
3  b  4
4  b  5
5  b  6
6  b  7
7  c  8

df[-3:]

   A  B
5  b  6
6  b  7
7  c  8

เช่นเดียวกับการโทรdf.iloc[-3:]เช่น ( ilocผู้ได้รับมอบหมายจากภายใน__getitem__)


นอกจากนี้หากคุณต้องการค้นหาแถว N สุดท้ายสำหรับแต่ละกลุ่มให้ใช้groupbyและGroupBy.tail:

df.groupby('A').tail(2)

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