पंक्ति ढूंढें जहां स्तंभ के लिए मान एक पांडा में अधिकतम है DataFrame


208

मैं उस पंक्ति को कैसे खोज सकता हूं जिसके लिए एक विशिष्ट स्तंभ का मूल्य अधिकतम है ?

df.max() मुझे प्रत्येक कॉलम के लिए अधिकतम मूल्य देगा, मुझे नहीं पता कि कैसे इसी पंक्ति को प्राप्त करना है।


क्या शीर्ष 2 मान प्राप्त करना संभव है? केवल अधिकतम के बजाय?
ऐशेकेटम

5
आप sort_valuesसूचकांक का उपयोग और प्राप्त कर सकते हैं :df.sort_values('col', ascending=False)[:2].index
lazy1

2
lazy1: अनावश्यक रूप से पूरी श्रृंखला को छाँटने से बचें क्योंकि यह औसतन O (N logN) है, जबकि अधिकतम / idxmax खोजना केवल O (N) है।
मुस्कान

जवाबों:


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 'के माध्यम से, तो आप जानना चाह सकते हैं कि अधिकतम पंक्ति 4 में होता है (पंक्ति' d 'नहीं)।
    • अगर आप चाहते हैं कि Indexआपके भीतर उस लेबल की पूर्णांक स्थिति इसे मैन्युअल रूप से प्राप्त हो (जो अब मुश्किल हो सकती है कि डुप्लिकेट पंक्ति लेबल की अनुमति हो)।

रासायनिक नोट:

  • idxmax()0.11 से पहले कहा जाता argmax()था
  • argmax 1.0.0 से पहले हटा दिया गया था और पूरी तरह से 1.0.0 में हटा दिया गया था
  • पंडों के रूप में वापस 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 पहचानकर्ता जैसे स्ट्रिंग लेबल। आप आसानी से आपकी मदद करने के लिए प्रकार प्रणाली का उपयोग नहीं कर सकते हैं, और आप अप्रत्याशित रूप से लापता डेटा में चलने के बिना सूचकांक पर विशिष्टता को लागू करने में सक्षम नहीं हो सकते हैं।

इसलिए आप इस उम्मीद के साथ रह गए हैं कि आपकी यूनिट के परीक्षण में सब कुछ शामिल है (वे नहीं किया था, या अधिक होने की संभावना नहीं है कि किसी ने कोई परीक्षण नहीं लिखा है) - अन्यथा (सबसे अधिक संभावना है) आप अभी इंतजार कर रहे हैं कि क्या आप इस में स्मैक करते हैं रनटाइम में त्रुटि, जिस स्थिति में आपको संभवतः डेटाबेस से कई घंटे काम के लायक छोड़ना पड़ता है जिसके परिणामस्वरूप आप परिणाम प्राप्त कर रहे थे, IPython में दीवार के खिलाफ अपना सिर धमाके से समस्या को मैन्युअल रूप से पुन: उत्पन्न करने की कोशिश कर रहा था, अंत में यह idxmaxसमझ में आया कि यह केवल इसलिए है अधिकतम पंक्ति के लेबल की रिपोर्ट करें , और फिर निराश हो रहे हैं कि कोई भी मानक फ़ंक्शन स्वचालित रूप से आपके लिए अधिकतम पंक्ति की स्थिति प्राप्त नहीं करता है, अपने आप को एक छोटी गाड़ी कार्यान्वयन लिख रहा है, कोड को संपादित कर रहा है, और प्रार्थना करता है कि आप फिर से समस्या में न दौड़ें।


13
वहां दूसरी-से-अंतिम टिप्पणी के आधार पर, यह दिखता है argminऔर इसका argmaxहिस्सा रहेगा DataFrameऔर अंतर सिर्फ इतना है कि क्या आप सूचकांक या लेबल चाहते हैं। idxmaxआपको उस स्थान का लेबल देगा जहां अधिकतम होता है। argmaxआप ही सूचकांक पूर्णांक दे देंगे।
एली

4
के बीच अंतर समझाने के लिए उपलब्ध कराई गई जानकारी argmaxऔर idxmax, और से बचने के लिए कैसे डुप्लिकेट सूचकांक के साथ कीड़े महान था! मैंने यह नहीं देखा है कि जब तक मैं दूसरे उत्तर में आपकी टिप्पणी नहीं पढ़ता। धन्यवाद!
ट्यूपन

जैसा कि आप जिस उपयोग को लागू करना चाहते हैं, उसके संबंध में, पंडों को 0.24.1 निम्नलिखित के लिए इंगित करता है: ' argmaxभविष्य में स्थिति को अधिकतम वापस करने के लिए व्यवहार को सही किया जाएगा। अभी के लिए, अधिकतम पंक्ति का उपयोग करें series.values.argmaxया np.argmax(np.array(values))प्राप्त करें। '
सैम

1
इसी तरह, .ixदूसरे उदाहरण के तरीके को नया नाम दिया गया है.iloc
Ma0

यदि आपके कॉलम में केवल नैन वैल्यूज हैं, तो इसका परिणाम 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मैं चाहता था कि सरणी हड़पने के लिए। अभी भी काम करता है।
योजिम्बो

2
ध्यान दें कि आपको idxmaxफीडर के रूप में ixया में आउटपुट का उपयोग करने में सावधानी बरतने की आवश्यकता हैloc डेटा को उप-स्लाइस करने के लिए और / या अधिकतम-पंक्ति की स्थिति को प्राप्त करने के साधन के रूप । क्योंकि आपके पास डुप्लिकेट हो सकते हैं Index- उदाहरण के लिए मेरे उत्तर के अपडेट को देखें।
Ely

25

उपरोक्त दोनों उत्तर केवल एक सूचकांक लौटाएंगे यदि कई पंक्तियाँ हैं जो अधिकतम मूल्य लेती हैं। यदि आप सभी पंक्तियों को चाहते हैं, तो फ़ंक्शन नहीं लगता है। लेकिन ऐसा करना मुश्किल नहीं है। नीचे श्रृंखला के लिए एक उदाहरण है; डेटाफ्रेम के लिए भी ऐसा ही किया जा सकता है:

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()]
डेनिस गोलोमेज़ोव

यह वास्तव में सही उत्तर (डेटाफ़्रेम संस्करण) है।
9

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

argmax()कॉलम के लिए अधिकतम मान के अनुरूप इंडेक्स प्रदान करेगा। 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()

हमारी साइट का प्रयोग करके, आप स्वीकार करते हैं कि आपने हमारी Cookie Policy और निजता नीति को पढ़ और समझा लिया है।
Licensed under cc by-sa 3.0 with attribution required.