एक स्तंभ का अधिकतम मूल्य ज्ञात करें और पंडों का उपयोग करके संबंधित पंक्ति मान लौटाएं


118

डेटा की संरचना;

पायथन पंडों का उपयोग करके मैं अधिकतम मूल्य के साथ Country& खोजने की कोशिश कर रहा हूं Place

यह अधिकतम मूल्य लौटाता है:

data.groupby(['Country','Place'])['Value'].max()

लेकिन मुझे इसका नाम Countryऔर Placeनाम कैसे मिलेगा ?

जवाबों:


170

मान लिया गया है dfकि एक अद्वितीय सूचकांक है, इससे अधिकतम मान के साथ पंक्ति मिलती है:

In [34]: df.loc[df['Value'].idxmax()]
Out[34]: 
Country        US
Place      Kansas
Value         894
Name: 7

ध्यान दें कि idxmaxइंडेक्स लेबल लौटाता है । इसलिए यदि DataFrame इंडेक्स में डुप्लिकेट है, तो लेबल विशिष्ट रूप से पंक्ति की पहचान नहीं कर सकता है, इसलिए df.locएक से अधिक पंक्ति वापस कर सकता है।

इसलिए, यदि आपके dfपास कोई अनन्य अनुक्रमणिका नहीं है, तो आपको उपरोक्त के रूप में आगे बढ़ने से पहले अनुक्रमणिका को विशिष्ट बनाना होगा। DataFrame के आधार पर, कभी-कभी आप इंडेक्स को विशिष्ट बनाने के लिए उपयोग stackया उपयोग कर सकते हैं set_index। या, आप बस अनुक्रमणिका को रीसेट कर सकते हैं (ताकि पंक्तियाँ फिर से शुरू हो जाएं, 0 से शुरू हो):

df = df.reset_index()

धन्यवाद। मुझे इसी की तो तलाश थी।
रिची

56
df[df['Value']==df['Value'].max()]

यह अधिकतम मान के साथ पूरी पंक्ति लौटाएगा


स्पष्टीकरण: - आंतरिक अभिव्यक्ति करता है dataFrame की लंबाई और है कि सूचकांक जो संतुष्ट अभिव्यक्ति (.max ()) के दाहिने हाथ की ओर सूचकांक, जो बारी में की है कि dataFrame पूरा पंक्ति कॉल रिटर्न भर में एक बूलियन जांच
पेंटा

10

देश और स्थान श्रृंखला का सूचकांक है, अगर आपको सूचकांक की आवश्यकता नहीं है, तो आप सेट कर सकते हैं as_index=False:

df.groupby(['country','place'], as_index=False)['value'].max()

संपादित करें:

ऐसा लगता है कि आप हर देश के लिए अधिकतम मूल्य वाला स्थान चाहते हैं, निम्नलिखित कोड वही करेगा जो आप चाहते हैं:

df.groupby("country").apply(lambda df:df.irow(df.value.argmax()))

कि केवल स्तंभ नाम और dtypes वापसी होगी
रिची

8

मुझे लगता है कि अधिकतम मूल्य के साथ एक पंक्ति को वापस करने का सबसे आसान तरीका इसका सूचकांक है। argmax()सबसे बड़े मूल्य के साथ पंक्ति के सूचकांक को वापस करने के लिए इस्तेमाल किया जा सकता है।

index = df.Value.argmax()

अब उस विशेष पंक्ति के लिए सुविधाओं को प्राप्त करने के लिए सूचकांक का उपयोग किया जा सकता है:

df.iloc[df.Value.argmax(), 0:2]

7

की indexविशेषता का उपयोग करें DataFrame। ध्यान दें कि मैं उदाहरण में सभी पंक्तियों को टाइप नहीं करता।

In [14]: df = data.groupby(['Country','Place'])['Value'].max()

In [15]: df.index
Out[15]: 
MultiIndex
[Spain  Manchester, UK     London    , US     Mchigan   ,        NewYork   ]

In [16]: df.index[0]
Out[16]: ('Spain', 'Manchester')

In [17]: df.index[1]
Out[17]: ('UK', 'London')

आप उस सूचकांक द्वारा मूल्य भी प्राप्त कर सकते हैं:

In [21]: for index in df.index:
    print index, df[index]
   ....:      
('Spain', 'Manchester') 512
('UK', 'London') 778
('US', 'Mchigan') 854
('US', 'NewYork') 562

संपादित करें

गलतफहमी के लिए खेद है कि आप क्या चाहते हैं, अनुवर्ती प्रयास करें:

In [52]: s=data.max()

In [53]: print '%s, %s, %s' % (s['Country'], s['Place'], s['Value'])
US, NewYork, 854

सही बात। लेकिन मैं एक लाइन आउटपुट की तलाश कर रहा हूं जो कहता है, 'यूएस, कंसास, 894'
रिची

धन्यवाद। यह वर्तमान डेटासेट के लिए समस्या को हल करेगा जहां मूल्यों के साथ सिर्फ 1 कॉलम है। जब मान @ unutbu के समाधान के साथ अधिक स्तंभ होते हैं तो बेहतर काम करेगा। फिर भी धन्यवाद।
रिची

5

अधिकतम मूल्य के साथ देश और स्थान को मुद्रित करने के लिए, कोड की निम्नलिखित पंक्ति का उपयोग करें।

print(df[['Country', 'Place']][df.Value == df.Value.max()])


2

मैं nlargestबेहतर प्रदर्शन और छोटे कोड के लिए उपयोग करने की सलाह दूंगा। आयातpandas

df[col_name].value_counts().nlargest(n=1)

2

आप उपयोग कर सकते हैं:

प्रिंट (df [df [ 'मान'] == df [ 'मान']। अधिकतम ()])


2

आयात पांडा
df आपके द्वारा बनाई गई डेटा फ़्रेम है।

कमांड का उपयोग करें:

df1=df[['Country','Place']][df.Value == df['Value'].max()]

यह देश और स्थान को प्रदर्शित करेगा जिसका मूल्य अधिकतम है।


0

पंडों का उपयोग करके डेटा आयात करने की कोशिश करते समय मुझे एक समान त्रुटि का सामना करना पड़ा, मेरे डेटासेट के पहले कॉलम में शब्दों की शुरुआत से पहले रिक्त स्थान थे। मैंने रिक्त स्थान हटा दिए और यह एक आकर्षण की तरह काम किया !!

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