如何获取 pandas DataFrame 的最后 N 行?

241

我有两个Pandas数据框df1df2(df1是普通数据框,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

为什么?如何获取没有索引的DataFrame df1 的最后三行?Pandas 0.10.1


4
你可以使用 df[-3:] 来获得想要的结果。WesM 曾将其视为错误,不确定何时会修复:https://dev59.com/kmzXa4cB1Zd3GeqPUID6 - Zelazny7
@Zelazny7,我认为这不正确。我认为使用ix进行负索引切片是一个bug,但是将负数切片传递给__getitem__不是。 df.iloc[-3:]在内部使用相同的参数委托给__getitem__,因此df[-3:]df.iloc[-3:]的快捷方式,而不是错误。 - cs95
请记住,ix正在被弃用。 - MSIS
3个回答

553

别忘记使用 DataFrame.tail! 比如 df1.tail(10)


111
这是因为使用整数索引(ix 通过 标签 选择大于 -3 的数据,而不是通过 位置,这是故意设计的:参见pandas中的整数索引“坑点”*)。
*在较新版本的pandas中,建议使用loc或iloc来消除ix作为位置或标签的歧义。
df.iloc[-3:]

请查看文档

正如Wes所指出的,在这种特定情况下,您应该使用tail!


1
@DavidWolever 我无法在0.14.1上重现你的IndexError,使用你的示例,df.iloc[-5:] 对我来说很好用。你使用的是哪个版本的pandas? - Andy Hayden

14

如何获取Pandas 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行,请使用groupbyGroupBy.tail

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

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

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接