पंडों के डेटाफ्रेम को प्रत्येक समूह की पहली पंक्ति मिलती है


137

मेरे पास DataFrameनिम्नलिखित की तरह एक पांडा है।

df = pd.DataFrame({'id' : [1,1,1,2,2,3,3,3,3,4,4,5,6,6,6,7,7],
                'value'  : ["first","second","second","first",
                            "second","first","third","fourth",
                            "fifth","second","fifth","first",
                            "first","second","third","fourth","fifth"]})

मैं इसे ["आईडी", "मूल्य"] द्वारा समूहित करना चाहता हूं और प्रत्येक समूह की पहली पंक्ति प्राप्त करना चाहता हूं।

        id   value
0        1   first
1        1  second
2        1  second
3        2   first
4        2  second
5        3   first
6        3   third
7        3  fourth
8        3   fifth
9        4  second
10       4   fifth
11       5   first
12       6   first
13       6  second
14       6   third
15       7  fourth
16       7   fifth

अनुमानित परिणाम

    id   value
     1   first
     2   first
     3   first
     4  second
     5  first
     6  first
     7  fourth

मैंने कोशिश की है जो केवल की पहली पंक्ति देता है DataFrame। इस बारे में कोई मदद की सराहना की है।

In [25]: for index, row in df.iterrows():
   ....:     df2 = pd.DataFrame(df.groupby(['id','value']).reset_index().ix[0])

2
मुझे एहसास है कि यह सवाल काफी पुराना है, लेकिन मैं @vital_dml द्वारा उत्तर को स्वीकार करने का सुझाव दूंगा क्योंकि first()नैंस के संबंध में व्यवहार बहुत ही आश्चर्यजनक है और मुझे लगता है कि ज्यादातर लोग उम्मीद नहीं करेंगे।
user545424

जवाबों:


238
>>> df.groupby('id').first()
     value
id        
1    first
2    first
3    first
4   second
5    first
6    first
7   fourth

यदि आपको idकॉलम की आवश्यकता है :

>>> df.groupby('id').first().reset_index()
   id   value
0   1   first
1   2   first
2   3   first
3   4  second
4   5   first
5   6   first
6   7  fourth

एन पहले रिकॉर्ड प्राप्त करने के लिए, आप सिर का उपयोग कर सकते हैं ():

>>> df.groupby('id').head(2).reset_index(drop=True)
    id   value
0    1   first
1    1  second
2    2   first
3    2  second
4    3   first
5    3   third
6    4  second
7    4   fifth
8    5   first
9    6   first
10   6  second
11   7  fourth
12   7   fifth

1
आपका बहुत बहुत धन्यवाद! अच्छी तरह से काम किया :) दूसरी पंक्ति को उसी तरह प्राप्त करना संभव नहीं है? क्या आप इसे भी समझा सकते हैं?
निलानी अलगीरियेज

g = df.groupby (['session']) g.agg (lambda x: x.iloc [0]) यह भी काम कर रहा है, दूसरा मूल्य प्राप्त करने का कोई विचार नहीं है? :(
निलानी अल्जीरिएज

मान लें कि आप शीर्ष से गिनती करना चाहते हैं, तो आप पंक्ति संख्या top_n प्राप्त करना चाहते हैं, फिर dx = df.groupby ('id')। शीर्ष (top_n) .reset_index (ड्रॉप = ट्रू) और मान लें कि आप पंक्ति संख्या प्राप्त करना चाहते हैं। bottom_n, उसके बाद dx = df.groupby ('id')। tail (bottom_n) .reset_index (ड्रॉप = ट्रू)
Quetzalcoatl

3
यदि आप अंतिम n पंक्तियाँ चाहते हैं, तो उपयोग tail(n)(डिफ़ॉल्ट n = 5) ( Ref। ) है। भ्रमित न होने के लिए last(), मैंने वह गलती की।
रोजवराज

groupby('id',as_index=False)idएक स्तंभ के रूप में भी रखता है
रिचर्ड डिसाल्वो

50

यह आपको प्रत्येक समूह की दूसरी पंक्ति देगा (शून्य अनुक्रमित, nth (0) पहले जैसा है) ():

df.groupby('id').nth(1) 

प्रलेखन: http://pandas.pydata.org/pandas-docs/stable/groupby.html#taking-the-nth-row-of-each-group


8
यदि आप गुणन चाहते हैं, तो पहले तीन की तरह, उदाहरण के लिए, जैसे अनुक्रम का उपयोग करें nth((0,1,2))या nth(range(3))
रोनन Paixão

@ RonanPaixão: किसी तरह जब मैं सीमा देता हूं, तो यह एक त्रुटि देता है:TypeError: n needs to be an int or a list/set/tuple of ints
शांतिपूर्ण

@ आकर्षक: आप पायथन 3 का उपयोग कर रहे हैं? यदि ऐसा है, तो range(3)जब तक आप टाइप नहीं करते हैं , तब तक कोई सूची नहीं लौटाता है list(range(3))
बेन

41

मैं इसके .nth(0)बजाय उपयोग करने का सुझाव दूंगा.first() यदि आप पहली पंक्ति प्राप्त करने की आवश्यकता।

उनके बीच का अंतर यह है कि वे NaNs को कैसे संभालते हैं, इसलिए .nth(0)समूह की पहली पंक्ति को कोई फर्क नहीं पड़ता कि इस पंक्ति में क्या मूल्य हैं, जबकि .first()अंततः पहले नहीं लौटेगा NaN प्रत्येक कॉलम में मान ।

जैसे अगर आपका डेटासेट है:

df = pd.DataFrame({'id' : [1,1,1,2,2,3,3,3,3,4,4],
            'value'  : ["first","second","third", np.NaN,
                        "second","first","second","third",
                        "fourth","first","second"]})

>>> df.groupby('id').nth(0)
    value
id        
1    first
2    NaN
3    first
4    first

तथा

>>> df.groupby('id').first()
    value
id        
1    first
2    second
3    first
4    first

1
अच्छी बात। .head(1)यह भी प्रतीत होता है .nth(0)कि सूचकांक को छोड़कर, जैसे
रिचर्ड डिसाल्वो

1
एक और अंतर यह है कि nth (0) मूल सूचकांक (यदि as_index = गलत) को संरक्षित करेगा, जबकि पहले () नहीं होगा। मेरे लिए यह एक बड़ा अंतर था, क्योंकि मुझे खुद ही सूचकांक की आवश्यकता थी।
ओलेग ओ

7

शायद यही आप चाहते हैं

import pandas as pd
idx = pd.MultiIndex.from_product([['state1','state2'],   ['county1','county2','county3','county4']])
df = pd.DataFrame({'pop': [12,15,65,42,78,67,55,31]}, index=idx)
                pop
state1 county1   12
       county2   15
       county3   65
       county4   42
state2 county1   78
       county2   67
       county3   55
       county4   31
df.groupby(level=0, group_keys=False).apply(lambda x: x.sort_values('pop', ascending=False)).groupby(level=0).head(3)

> Out[29]: 
                pop
state1 county3   65
       county4   42
       county2   15
state2 county1   78
       county2   67
       county3   55

7

यदि आपको केवल प्रत्येक समूह से पहली पंक्ति की आवश्यकता है, जो हम कर सकते हैं drop_duplicates, तो फ़ंक्शन डिफ़ॉल्ट विधि को नोटिस करें keep='first'

df.drop_duplicates('id')
Out[1027]: 
    id   value
0    1   first
3    2   first
5    3   first
9    4  second
11   5   first
12   6   first
15   7  fourth
हमारी साइट का प्रयोग करके, आप स्वीकार करते हैं कि आपने हमारी Cookie Policy और निजता नीति को पढ़ और समझा लिया है।
Licensed under cc by-sa 3.0 with attribution required.