팬더 DataFrame의 마지막 N 행을 얻는 방법은 무엇입니까?


175

팬더 데이터 프레임이 df1있고 df2(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

왜 ? 마지막 3 행을 얻는 방법 df1(인덱스가없는 데이터 프레임)? 팬더 0.10.1


3
df[-3:]원하는 결과를 생성하는 데 사용할 수 있습니다 . 이것은 WesM에 의해 버그로 해결되었습니다. 확실하지 경우 /이 고정 점점 때 stackoverflow.com/questions/14035817/...
Zelazny7

@ Zelazny7 나는 그것이 맞지 않다고 생각합니다. 부정적인 슬라이싱 ix은 버그 라고 생각 하지만 부정적인 조각을 전달하는 __getitem__것은 아닙니다. df.iloc[-3:]내부적으로 __getitem__동일한 인수 를 사용하여 위임하는 것은 버그가 아닌 df[-3:]바로 가기입니다 df.iloc[-3:].
cs95

답변:



74

이것은 정수 인덱스를 사용하기 때문입니다 ( position 대신 -3 이상의 레이블ix레이블 을 선택합니다). 이것은 의도적으로 설계된 것입니다. 팬더 "gotchas"의 정수 색인 참조 *).

* 팬더의 최신 버전에서는 loc 또는 iloc을 선호하여 위치 또는 레이블로 ix의 모호성을 제거합니다.

df.iloc[-3:]

문서를 참조하십시오 .

Wes가 지적했듯이이 특정한 경우에는 꼬리를 사용해야합니다!


1
@DavidWolever 0.14.1에서 IndexError를 재현 할 수 없으므로 df.iloc [-5 :]가 귀하의 예와 함께 잘 작동합니다. 어떤 판다 버전을 사용하고 있습니까?
Andy Hayden

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 개 행을 찾으려면 groupbyand를 사용하십시오 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.