pandas DataFrame에서 열의 값이 최대 인 행 찾기


208

특정 열의 값이 최대 인 행을 어떻게 찾을 수 있습니까?

df.max() 각 열의 최대 값을 알려 드리겠습니다. 해당 행을 얻는 방법을 모르겠습니다.


상위 2 개의 값을 얻을 수 있습니까? 최대 대신에?
— AsheKetchum

5
당신은 sort_values색인을 사용 하고 얻을 수 있습니다 :df.sort_values('col', ascending=False)[:2].index
— lazy1

2
lazy1 : 전체 계열이 평균 O (N logN)이기 때문에 불필요하게 전체 계열을 정렬하지 말고 max / idxmax를 찾는 것은 O (N)뿐입니다.
— smci

답변:


240

팬더 idxmax기능을 사용하십시오 . 간단합니다 :

>>> import pandas
>>> import numpy as np
>>> df = pandas.DataFrame(np.random.randn(5,3),columns=['A','B','C'])
>>> df
          A         B         C
0  1.232853 -1.979459 -0.573626
1  0.140767  0.394940  1.068890
2  0.742023  1.343977 -0.579745
3  2.125299 -0.649328 -0.211692
4 -0.187253  1.908618 -1.862934
>>> df['A'].argmax()
3
>>> df['B'].argmax()
4
>>> df['C'].argmax()
1
  • 또는 당신은 또한 사용할 수있는 numpy.argmax등, numpy.argmax(df['A'])그것을 최대한 빨리 적어도 같은 일을 제공하고 나타납니다 - idxmax피상적 관찰한다.

  • idxmax() 정수가 아닌 인덱스 레이블을 반환합니다.

    • 예 ':'a '부터'e '까지의 행과 같이 문자열 값을 색인 레이블로 사용하는 경우 최대 값이 행'd '가 아닌 행 4에서 발생 함을 알고 싶을 수 있습니다.
    • 그 레이블의 정수 위치를 원한다면 Index수동으로 가져와야합니다 (중복 행 레이블이 허용되므로 까다로울 수 있습니다).

역사적 메모 :

  • idxmax()0.11 이전에 호출argmax()
  • argmax 1.0.0 이전에 더 이상 사용되지 않으며 1.0.0에서 완전히 제거되었습니다.
  • Pandas 0.16부터는 argmax존재하고 동일한 기능을 수행하는 데 사용되었습니다 ( idxmax) 보다 느리게 실행되는 것처럼 보입니다 .
    • argmax함수 는 최대 요소의 행 위치 색인 내 에서 정수 위치를 리턴했습니다 .
    • 팬더는 정수 인덱스 대신 행 레이블을 사용하도록 이동했습니다. 위치 정수 인덱스는 특히 중복 행 레이블이 공통 인 응용 프로그램에서 레이블보다 더 일반적이고 더 일반적이었습니다.

예를 들어, DataFrame중복 장난감으로이 장난감 을 생각해보십시오 .

In [19]: dfrm
Out[19]: 
          A         B         C
a  0.143693  0.653810  0.586007
b  0.623582  0.312903  0.919076
c  0.165438  0.889809  0.000967
d  0.308245  0.787776  0.571195
e  0.870068  0.935626  0.606911
f  0.037602  0.855193  0.728495
g  0.605366  0.338105  0.696460
h  0.000000  0.090814  0.963927
i  0.688343  0.188468  0.352213
i  0.879000  0.105039  0.900260

In [20]: dfrm['A'].idxmax()
Out[20]: 'i'

In [21]: dfrm.iloc[dfrm['A'].idxmax()]  # .ix instead of .iloc in older versions of pandas
Out[21]: 
          A         B         C
i  0.688343  0.188468  0.352213
i  0.879000  0.105039  0.900260

따라서 여기서는 순진한 사용은 idxmax충분하지 않지만 이전 형식은 최대 행 argmax의 위치를 정확하게 제공합니다 (이 경우 위치 9).

이것은 동적으로 유형이 지정된 언어에서 불쾌한 종류의 버그가 발생하기 쉬운 동작 중 하나입니다. 시스템 코드를 작성 중이고 시스템이 결합되기 전에 올바르게 정리되지 않은 일부 데이터 세트에서 갑자기 사용되는 경우 중복 행 레이블, 특히 금융 자산의 CUSIP 또는 SEDOL ID와 같은 문자열 레이블로 끝나기가 매우 쉽습니다. 유형 시스템을 사용하여 쉽게 도움을 줄 수 없으며 예기치 않게 누락 된 데이터가 발생하지 않으면 인덱스에 고유성을 적용하지 못할 수 있습니다.

따라서 단위 테스트가 모든 것을 다룰 수 있기를 바라고 있습니다 (그들은 테스트를하지 않았거나 더 이상 아무도 작성하지 않았을 것입니다). 당신은 아마 당신이 수동으로 문제를 재현하려고 IPython의 벽에 머리를 쾅 결과를 출력 한 데이터베이스에서 작업을 몇 시간 가치를 떨어 가야하는 경우 런타임에 오류가, 마침내 있다고 파악 때문에 idxmax할 수있는 유일한 max 행 의 레이블 을 보고 그런 다음 표준 함수가 자동으로 max 행 의 위치 를 얻지 못하여 버그가있는 구현을 작성하고 코드를 편집하며 문제가 다시 발생하지 않도록기도합니다.


13
거기에 마지막에서 두 번째 의견을 바탕으로, 그것은 모양 argmin과 argmax의 일부가 남아 DataFrame과 차이점은 인덱스 또는 라벨을 원하는 단지 여부입니다. idxmax최대 값이 발생하는 위치의 레이블을 제공합니다. argmax인덱스 정수 자체를 제공합니다.
— ely

4
사이의 차이를 설명하기 위해 제공하는 정보 argmax와 idxmax,와 중복 인덱스 버그가 좋았어요 방지하는 방법! 다른 답변에서 귀하의 의견을 읽을 때까지는 알지 못했습니다. 감사!
— tupan

구현하려는 사용과 관련하여 Pandas 0.24.1은 다음을 가리 킵니다 argmax. 지금은 사용 series.values.argmax또는 np.argmax(np.array(values))최대 행의 위치를 얻을 수 있습니다. '
— Sam

1
마찬가지로, .ix두 번째 예의 방법은 다음과 같이 이름이 바뀌 었습니다..iloc
— Ma0

열에 nan 값만 포함 된 경우 TypeError
— Max Segal

77

시도해 볼 수도 있습니다 idxmax.

In [5]: df = pandas.DataFrame(np.random.randn(10,3),columns=['A','B','C'])

In [6]: df
Out[6]: 
          A         B         C
0  2.001289  0.482561  1.579985
1 -0.991646 -0.387835  1.320236
2  0.143826 -1.096889  1.486508
3 -0.193056 -0.499020  1.536540
4 -2.083647 -3.074591  0.175772
5 -0.186138 -1.949731  0.287432
6 -0.480790 -1.771560 -0.930234
7  0.227383 -0.278253  2.102004
8 -0.002592  1.434192 -1.624915
9  0.404911 -2.167599 -0.452900

In [7]: df.idxmax()
Out[7]: 
A    0
B    8
C    7

예 :

In [8]: df.loc[df['A'].idxmax()]
Out[8]: 
A    2.001289
B    0.482561
C    1.579985

감사합니다 웨스. 여기 idxmax에 대한 설명서 () : pandas.pydata.org/pandas-docs/dev/generated/...
— 윌

df.ix[df['A'].idxmax()].values내가 원하는 배열을 잡기 위해. 여전히 작동합니다.
— Yojimbo

2
참고이의 출력을 사용하려고 조심해야 할 필요가 idxmax로 공급 장치 등을 ix하거나 loc하위 슬라이스 수단으로 데이터 및 / 또는 최대 행의 위치 위치를 얻을 수 있습니다. 에 중복이있을 수 있으므로 Index예를 보려면 내 대답에 대한 업데이트를 참조하십시오.
— ely

25

위의 두 대답은 최대 값을 취하는 여러 행이있는 경우 하나의 인덱스 만 반환합니다. 모든 행을 원하면 기능이없는 것 같습니다. 그러나 어렵지 않습니다. 아래는 Series의 예입니다. DataFrame에 대해서도 동일하게 수행 할 수 있습니다.

In [1]: from pandas import Series, DataFrame

In [2]: s=Series([2,4,4,3],index=['a','b','c','d'])

In [3]: s.idxmax()
Out[3]: 'b'

In [4]: s[s==s.max()]
Out[4]: 
b    4
c    4
dtype: int64

10
감사! DataFrame 버전 :df[df['A'] == df['A'].max()]
— Dennis Golomazov

이것은 실제로 정답입니다 (DataFrame 버전).
— gented

12
df.iloc[df['columnX'].argmax()]

argmax()columnX의 최대 값에 해당하는 인덱스를 제공합니다. iloc이 인덱스에 대한 DataFrame df 행을 가져 오는 데 사용할 수 있습니다.


4

직접 ".argmax ()"솔루션이 작동하지 않습니다.

@ely가 제공 한 이전 예제

>>> import pandas
>>> import numpy as np
>>> df = pandas.DataFrame(np.random.randn(5,3),columns=['A','B','C'])
>>> df
      A         B         C
0  1.232853 -1.979459 -0.573626
1  0.140767  0.394940  1.068890
2  0.742023  1.343977 -0.579745
3  2.125299 -0.649328 -0.211692
4 -0.187253  1.908618 -1.862934
>>> df['A'].argmax()
3
>>> df['B'].argmax()
4
>>> df['C'].argmax()
1

다음 메시지를 반환합니다.

FutureWarning: 'argmax' is deprecated, use 'idxmax' instead. The behavior of 'argmax' 
will be corrected to return the positional maximum in the future.
Use 'series.values.argmax' to get the position of the maximum now.

내 솔루션은 다음과 같습니다.

df['A'].values.argmax()

2
mx.iloc[0].idxmax()

이 한 줄의 코드는 데이터 프레임의 행에서 최대 값을 찾는 방법을 제공합니다. 여기 mx에 데이터 프레임이 있으며 iloc[0]0 번째 인덱스를 나타냅니다.


1

idmaxDataFrame의 최대 값과의 행동과 행의 라벨 인덱스를 반환 argmax의 버전에 따라 다릅니다 pandas(지금은 경고 반환). 위치 인덱스 를 사용하려는 경우 다음을 수행 할 수 있습니다.

max_row = df['A'].values.argmax()

또는

import numpy as np
max_row = np.argmax(df['A'].values)

사용하는 경우 np.argmax(df['A'])와 동일하게 작동합니다 df['A'].argmax().

당사 사이트를 사용함과 동시에 당사의 쿠키 정책과 개인정보 보호정책을 읽고 이해하였음을 인정하는 것으로 간주합니다.
Licensed under cc by-sa 3.0 with attribution required.