পান্ডস ডাটাফ্রেমে প্রতিটি গ্রুপের প্রথম সারি পাওয়া যায়


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()প্রতি শ্রদ্ধার সাথে আচরণ করা খুব অবাক করা এবং এমন কিছু বিষয় যা আমি মনে করি বেশিরভাগ মানুষ আশা করবেন না।
ব্যবহারকারীর 4545424

উত্তর:


236
>>> 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 (['সেশন']) g.agg (ল্যাম্বদা x: x.iloc [0]) এটিও কাজ করছে, দ্বিতীয় মান পাওয়ার কোনও ধারণা নেই? :(
নীলাণী আলগিরিয়াজে

ধরুন যে শীর্ষ থেকে গণনাটি আপনি সারি নম্বর শীর্ষ_ই পেতে চান, তারপরে dx = df.groupby ('id') head । bottom_n, তারপর DX = df.groupby ( 'আইডি') লেজ (bottom_n) .reset_index (ড্রপ = true)
Quetzalcoatl

3
আপনি যদি সর্বশেষ এন সারি চান তবে ব্যবহার করুন tail(n)(ডিফল্ট হ'ল এন = 5) ( রেফারি )। বিভ্রান্ত হওয়ার দরকার নেই last(), আমি সেই ভুলটি করেছিলাম।
rocarvaj

groupby('id',as_index=False)idএকটি কলাম হিসাবে রাখে
রিচার্ড ডিসালভো

50

এটি আপনাকে প্রতিটি গোষ্ঠীর দ্বিতীয় সারি দেবে (শূন্য সূচী, নবম (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))
রোনান পাইক্সিও

@ রোনানপেক্সো: কোনওভাবেই যখন আমি পরিসীমা দেই, তখন এটি একটি ত্রুটি ছুঁড়ে দেয়:TypeError: n needs to be an int or a list/set/tuple of ints
শান্তিকাল

@ প্রশংসনীয়: আপনি কি পাইথন 3 ব্যবহার করছেন? যদি তা range(3)হয় তবে আপনি টাইপ না করে কোনও তালিকা ফিরিয়ে দেবেন না list(range(3))
বেন

41

আপনার যদি প্রথম সারির দরকার হয় .nth(0)তার চেয়ে আমি ব্যবহার করার পরামর্শ দেব .first()

তাদের মধ্যে পার্থক্য হ'ল তারা কীভাবে এনএএনগুলি পরিচালনা করে, সুতরাং .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
আর একটি পার্থক্য হ'ল নবম (০) মূল সূচকটি সংরক্ষণ করবে (যদি as_index = মিথ্যা) তবে প্রথম () না করবে O তবে আমার পক্ষে এটি ছিল একটি যথেষ্ট পার্থক্য, যেহেতু আমাকে নিজেই সূচকের প্রয়োজন ছিল।
ওলেগ হে

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
আমাদের সাইট ব্যবহার করে, আপনি স্বীকার করেছেন যে আপনি আমাদের কুকি নীতি এবং গোপনীয়তা নীতিটি পড়েছেন এবং বুঝতে পেরেছেন ।
Licensed under cc by-sa 3.0 with attribution required.