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

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

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



답변

팬더 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 행 의 위치 를 얻지 못하여 버그가있는 구현을 작성하고 코드를 편집하며 문제가 다시 발생하지 않도록기도합니다.


답변

시도해 볼 수도 있습니다 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


답변

위의 두 대답은 최대 값을 취하는 여러 행이있는 경우 하나의 인덱스 만 반환합니다. 모든 행을 원하면 기능이없는 것 같습니다. 그러나 어렵지 않습니다. 아래는 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


답변

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

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


답변

직접 “.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()


답변

mx.iloc[0].idxmax()

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


답변

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().