मेरे पास इस तरह एक डेटाफ्रेम है:

df=pd.DataFrame({'State' : ['A', 'A', 'A', 'B', 'B', 'B', 'C', 'C', 'C'],
            'County' : ['a', 'b', 'c', 'd', 'e', 'f', 'g', 'h', 'i'],
            'Population': [10, 11, 12, 13, 17, 16, 15, 18, 14]})

प्रत्येक राज्य के लिए दो सबसे अधिक आबादी वाले काउंटियों को देखते हुए, दो सबसे अधिक आबादी वाले राज्य (उच्चतम जनसंख्या से निम्नतम जनसंख्या के क्रम में) कौन से हैं?

मैंने इसे लूप का उपयोग करके हल किया है, और अब मैं एक ही परिणाम समूहीकरण, सारांश, सॉर्टिंग और चयन करने का प्रयास कर रहा हूं। निम्नलिखित कोड काम करता है, लेकिन मुझे यकीन है कि ऐसा करने के लिए कई अलग और अधिक शानदार तरीके हैं।

df.groupby(['State'])['Population'].nlargest(2).groupby(['State']).sum()\
  .sort_values(ascending=False)[:2].to_frame()\
  .reset_index()['State'].tolist()
1
Federico Mancini 25 नवम्बर 2019, 21:37

2 जवाब

आप इसे छोटा नहीं कर सकते।

df.groupby(['State'])['Population'].nlargest(2)\
  .sum(level=0).sort_values(ascending=False).index[:2].tolist()

डेटाफ़्रेम में वापस लौटने की स्थिति में बदलने की आवश्यकता नहीं है, बस राज्यों को सीधे सूचकांक से प्राप्त करें। sum के साथ level पैरामीटर का उपयोग करना केवल छोटा सिंटैक्स है जो फिर से ग्रुपबाय पर है।

0
Scott Boston 25 नवम्बर 2019, 21:44
(df.sort_values('Population', ascending=False) # order by highest population per country 
.groupby('State').head(2) # get two most populous counties per state
 .groupby('State').sum() # get population of two largest counties per state
 .sort_values('Population', ascending = False)[:2] # get top 2 states by population
 .index # get states names
 .tolist() # convert to list
)

प्रत्येक ऑपरेशन के स्पष्टीकरण के साथ इसे करने का एक वैकल्पिक तरीका यहां दिया गया है

0
Brandon 25 नवम्बर 2019, 22:34