问题:如何获取熊猫DataFrame的最后N行?
我有熊猫数据帧df1
和df2
(df1是vanila数据帧,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
为什么呢 如何获得df1
(索引的数据帧)的最后3行?熊猫0.10.1
回答 0
别忘了DataFrame.tail
!例如df1.tail(10)
回答 1
这是因为使用整数索引(通过-3而不是positionix
通过标签选择索引,这是设计使然:请参见pandas“ gotchas” *中的整数索引)。
*在较新版本的熊猫中,建议使用loc或iloc删除ix作为位置或标签的歧义:
df.iloc[-3:]
请参阅文档。
正如Wes所指出的,在这种特定情况下,您应该只使用tail!
回答 2
如何获取熊猫DataFrame的最后N行?
如果您按位置进行切片,__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