如何获取 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 数据框 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
【问题讨论】:
您可以使用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 行,请使用 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
【讨论】:
以上是关于如何获取 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控制拆分的次数获取所有列表中最后一个位置元素内容