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

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