パンダのDataFrameの最後のN行を取得するにはどうすればよいですか?


175

私はパンダのデータフレーム持っている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

どうして ?df1(インデックスのないデータフレーム)の最後の3行を取得するにはどうすればよいですか?パンダ0.10.1


3
を使用df[-3:]して、必要な結果を生成できます。これは、WesMによってバグとして対処されました。わからない場合は/それは固定なってきたとき:stackoverflow.com/questions/14035817/...
Zelazny7

@ Zelazny7そうではないと思います。ネガティブスライスixはバグだったと思いますが、ネガティブスライスを渡すのはバグで__getitem__はありません。df.iloc[-3:]内部的に__getitem__同じ引数で委任しますdf[-3:]。doはのショートカットdf.iloc[-3:]であり、バグではありません。
cs95

回答:



74

これは、整数インデックスを使用しているためです(positionではなく-3以上のラベルでインデックスixを選択します。これは設計によるものです。pandas "gotchas"の整数インデックスを参照してください*)。

*パンダの新しいバージョンでは、位置またはラベルとしてのixのあいまいさを取り除くために、locまたはilocが優先されます。

df.iloc[-3:]

docsを参照してください

Wesが指摘しているように、この特定のケースでは、tailを使用するだけです!


1
@DavidWolever 0.14.1ではIndexErrorを再現できません。あなたの例では、df.iloc [-5:]がうまく機能します。どのバージョンのパンダを使用していますか?
アンディヘイデン

10

パンダの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、andを使用し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.