Panda değerlerinde sütun değerlerinin maksimum olduğu satırı bulma DataFrame


208

Nasıl belirli bir sütunun değeri olduğu satır bulabilirsiniz maksimal ?

df.max() bana her sütun için maksimum değeri verecektir, karşılık gelen satır almak için nasıl bilmiyorum.


İlk 2 değeri elde etmek mümkün müdür? sadece max yerine?
AsheKetchum

5
Kullanabilir sort_valuesve dizini alabilirsiniz:df.sort_values('col', ascending=False)[:2].index
lazy1

2
tembel1: ortalama olarak O (N logN) olduğu için tüm serileri gereksiz yere sıralamaktan kaçınırken, max / idxmax'ı bulmak sadece O (N) 'dir.
smci

Yanıtlar:


240

Panda idxmaxişlevini kullanın . Anlaşılır:

>>> 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
  • Alternatif numpy.argmaxolarak numpy.argmax(df['A']), aynı şeyi sağlar ve en azından idxmaxlanet gözlemlerde olduğu kadar hızlı görünür .

  • idxmax() tamsayıları değil, indeks etiketlerini döndürür.

    • Örnek ':' a '-' e 'satırları gibi dizin etiketleriniz olarak dize değerleriniz varsa, maks'in 4. satırda (' d 'satırında değil) gerçekleştiğini bilmek isteyebilirsiniz.
    • bu etiketin tamsayı konumunu istiyorsanız, Indexmanuel olarak almanız gerekir (bu, yinelenen satır etiketlerine izin verildiğinde zor olabilir).

TARİHİ NOTLAR:

  • idxmax()0.11'den önce çağrılırdıargmax()
  • argmax 1.0.0'dan önce kullanımdan kaldırıldı ve 1.0.0'da tamamen kaldırıldı
  • Pandalar 0.16'dan argmaxberi, aynı işlevi vardı ve gerçekleştirdi (daha yavaş çalıştığı görüldü idxmax).
    • argmaxişlevi , maksimum öğenin satır konumu dizini içindeki tamsayı konumunu döndürdü .
    • pandalar, tamsayı dizinleri yerine satır etiketleri kullanmaya taşındı. Konumsal tamsayı endeksleri, özellikle yinelenen satır etiketlerinin yaygın olduğu uygulamalarda, etiketlerden çok daha yaygındı.

Örneğin, bu oyuncağı DataFrameyinelenen bir satır etiketi ile düşünün :

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

Bu yüzden burada naif bir kullanım idxmaxyeterli değildir, ancak eski formu , maksimum sıranın konum konumunu argmaxdoğru bir şekilde sağlayacaktır (bu durumda, konum 9).

Bu, dinamik olarak yazılan dillerde bu tür şeyleri bu kadar talihsiz ve ölü bir atı yenmeye değer yapan bu tür hataya eğilimli davranışlardan biridir. Sistem kodu yazıyorsanız ve sisteminiz birleştirilmeden önce düzgün şekilde temizlenmeyen bazı veri kümelerinde aniden kullanılıyorsa, yinelenen satır etiketleri, özellikle finansal varlıklar için CUSIP veya SEDOL tanımlayıcısı gibi dize etiketleri ile son derece kolaydır. Yazı sistemini size yardımcı olması için kolayca kullanamazsınız ve beklenmedik bir şekilde eksik verilere rastlamadan dizinde benzersizliği uygulayamayabilirsiniz.

Böylece, birim testlerinizin her şeyi kapsadığını umuyorsunuz (hiç kimsenin hiç test yazmamış olması muhtemeldir) - aksi takdirde (büyük olasılıkla) bunu kaçırıp kaçırmayacağınızı görmek için beklemişsinizdir. muhtemelen elle sorunu yeniden çalışırken ipython içinde kafanı duvara çarpardı sonuçları çıkışının edildi veritabanından işin kaç saat değerinde damla gitmek zorunda bu durumda çalışma zamanında hata, nihayet olduğunu bulmaktan dolayı idxmaxcan sadece max satırının etiketini rapor edin ve daha sonra hiçbir standart işlevin otomatik olarak max satırının konumlarını almamasını, kendiniz için bir hata ayıklama uygulaması yazmanız, kodu düzenlemeniz ve sorunla tekrar karşılaşmadığınız için dua etmekten hayal kırıklığına uğratmak .


13
Orada ikinci-son yoruma dayanarak, bir parçası gibi görünüyor argminve bir argmaxparçası olarak kalacak DataFrameve fark sadece dizin veya etiket isteyip istemediğinizdir. idxmaxsize maks'in oluştuğu yerin etiketini verecektir. argmaxsize indeks tamsayısının kendisini verecektir.
ely

4
Ve arasındaki farkı açıklamak için sağlanan bilgiler argmaxve idxmaxyinelenen indeksli hataların nasıl önleneceği harikaydı! Diğer cevaptaki yorumunuzu okuyana kadar bunu farketmedim. Teşekkürler!
tupan

Uygulamak istediğiniz kullanımla ilgili olarak, Pandalar 0.24.1 aşağıdakilere işaret eder: ' argmaxilerideki konumsal maksimum değeri döndürmek için davranışı düzeltilecektir. Şimdilik , maksimum satırın konumunu almak için series.values.argmaxveya np.argmax(np.array(values))düğmesini kullanın . '
Sam

1
benzer şekilde, .ixikinci örneğin yöntemi yeniden adlandırıldı.iloc
Ma0

sütununuz yalnızca nan değerleri içeriyorsa, bu TypeError ile sonuçlanır
Max Segal

77

Ayrıca deneyebilirsiniz 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

Örneğin

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

Teşekkürler Wes. Burada idxmax için Belgeler (): pandas.pydata.org/pandas-docs/dev/generated/...
Will

df.ix[df['A'].idxmax()].valuesistediğim dizi kapmak için. hala çalışıyor.
Yojimbo

2
Verileri alt dilimlemek için idxmaxbir besleyici olarak ixveya locbir araç olarak kullanmaya ve / veya maks. Satırın konum konumunu elde etmeye çalışırken dikkatli olmanız gerektiğini unutmayın . Çünkü içinde kopyalar olabilir Index- bir örnek için cevabımın güncellemesine bakın.
ely

25

Yukarıdaki yanıtların her ikisi de, maksimum değeri alan birden çok satır olduğunda yalnızca bir dizin döndürür. Tüm satırları istiyorsanız, bir işlevi yok gibi görünüyor. Ama bunu yapmak zor değil. Aşağıda Seri için bir örnek; aynısı DataFrame için de yapılabilir:

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
Teşekkürler! sürümü için sürüm:df[df['A'] == df['A'].max()]
Dennis Golomazov

Bu gerçekten doğru cevaptır (DataFrame sürümü).
gented

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

argmax()columnX için maksimum değere karşılık gelen dizini sağlar. ilocbu dizin için DataFrame df satırını almak için kullanılabilir.


4

Doğrudan ".argmax ()" çözümü benim için çalışmıyor.

@Ely tarafından sağlanan önceki örnek

>>> 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

aşağıdaki iletiyi döndürür:

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.

Benim çözümüm:

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

2
mx.iloc[0].idxmax()

Bu bir kod satırı, veri çerçevesindeki bir satırdan maksimum değeri nasıl bulacağınızı verir, burada mxveri çerçevesi ve 0'ıncı iloc[0]dizini gösterir.


1

idmaxDataFrame maksimum değerine ve davranışı ile satırın etiket dizini döndürür argmaxsürümüne bağlıdır pandas(şu anda bunu bir uyarı verir). Konum dizinini kullanmak istiyorsanız, aşağıdakileri yapabilirsiniz:

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

veya

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

np.argmax(df['A'])Kullandığınız gibi davrandığını unutmayın df['A'].argmax().

Sitemizi kullandığınızda şunları okuyup anladığınızı kabul etmiş olursunuz: Çerez Politikası ve Gizlilik Politikası.
Licensed under cc by-sa 3.0 with attribution required.