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

Posted

技术标签:

【中文标题】如何获取 pandas DataFrame 的最后 N 行?【英文标题】:How to get the last N rows of a pandas DataFrame? 【发布时间】:2013-01-17 18:02:08 【问题描述】:

我有 pandas 数据框 df1df2(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

【问题讨论】:

您可以使用df[-3:] 来生成您想要的结果。 WesM 将其作为一个错误解决。不确定是否/何时修复:***.com/questions/14035817/… @Zelazny7 我认为这不对。我认为使用ix 进行负切片是一个错误,但将负切片传递给__getitem__ 则不是。 df.iloc[-3:] 内部委托给 __getitem__ 具有相同的参数,df[-3:]df.iloc[-3:] 的快捷方式,而不是错误。 记住 ix 已被弃用。 【参考方案1】:

别忘了DataFrame.tail!例如df1.tail(10)

【讨论】:

【参考方案2】:

这是因为使用了整数索引(ix 通过 label 而不是 position 选择那些,这是设计使然:参见 integer indexing in pandas "gotchas"* )。

*在新版本的 pandas 中更喜欢 loc 或 iloc 来消除 ix 作为位置或标签的歧义:

df.iloc[-3:]

见docs

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

【讨论】:

@DavidWolever 我无法在 0.14.1 上重现您的 IndexError,df.iloc[-5:] 在您的示例中对我来说很好。你用的是哪个版本的熊猫?【参考方案3】:

如何获取 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

【讨论】:

以上是关于如何获取 pandas DataFrame 的最后 N 行?的主要内容,如果未能解决你的问题,请参考以下文章

pandas通过DatetimeProperties对象获取日期对象是否是所在季度的最后一天(is quarter end)筛选dataframe数据中日期对象是所在季度最后一天的数据行

pandas通过DatetimeProperties对象获取日期对象是否是所在年份的最后一天(is year end)筛选dataframe数据中日期对象是所在年份最后一天的数据行

pandas使用pd.offsets.BMonthEnd把dataframe数据中的时间数据列统一移动到所在月份上的月底最后一天(正确获取月末业务商业日期)

pandas使用groupby函数基于指定分组变量对dataframe数据进行分组使用last函数获取每个分组数据中每个分组的最后一个样本数据

如何更改 pandas DataFrame 的最后 7 列的列名? [复制]

Pandas处理dataframe的文本数据列:使用str属性获取数据列的字符串方法类split函数基于指定分隔符拆分数据列的内容为列表设置参数n控制拆分的次数获取所有列表中最后一个位置元素内容