গোষ্ঠীগুলির মধ্যে গ্রুপ প্যান্টগুলি বাছাই করুন


166

আমি আমার ডেটাফ্রেমকে দুটি কলাম দ্বারা গোষ্ঠী করতে চাই এবং তারপরে গোষ্ঠীগুলির মধ্যে একত্রিত ফলাফলগুলি বাছাই করতে চাই।

In [167]:
df

Out[167]:
count   job source
0   2   sales   A
1   4   sales   B
2   6   sales   C
3   3   sales   D
4   7   sales   E
5   5   market  A
6   3   market  B
7   2   market  C
8   4   market  D
9   1   market  E

In [168]:
df.groupby(['job','source']).agg({'count':sum})

Out[168]:
            count
job     source  
market  A   5
        B   3
        C   2
        D   4
        E   1
sales   A   2
        B   4
        C   6
        D   3
        E   7

আমি এখন গোষ্ঠীগুলির প্রত্যেকটির মধ্যে ক্রমান্বিত ক্রমে গণনা কলামটি বাছাই করতে চাই। এবং তারপরে কেবল শীর্ষ তিনটি সারি নিন। এর মতো কিছু পেতে:

            count
job     source  
market  A   5
        D   4
        B   3
sales   E   7
        C   6
        B   4

উত্তর:


147

আপনি যা করতে চান তা হ'ল আবার একটি গ্রুপবাই (প্রথম গ্রুপবাইয়ের ফলাফলের ভিত্তিতে): প্রতি গ্রুপে প্রথম তিনটি উপাদান সাজান এবং নিন।

প্রথম গোষ্ঠীর ফলাফল থেকে শুরু:

In [60]: df_agg = df.groupby(['job','source']).agg({'count':sum})

আমরা সূচকের প্রথম স্তর অনুসারে গ্রুপ করি:

In [63]: g = df_agg['count'].groupby(level=0, group_keys=False)

তারপরে আমরা প্রতিটি গ্রুপকে বাছাই করতে ('অর্ডার') দিতে এবং প্রথম তিনটি উপাদান নিতে চাই:

In [64]: res = g.apply(lambda x: x.order(ascending=False).head(3))

তবে এর জন্য, এটি করার জন্য একটি শর্টকাট ফাংশন রয়েছে nlargest:

In [65]: g.nlargest(3)
Out[65]:
job     source
market  A         5
        D         4
        B         3
sales   E         7
        C         6
        B         4
dtype: int64

গোষ্ঠী অনুসারে শীর্ষ তিনটি ফলাফলের মধ্যে অন্তর্ভুক্ত না থাকা সমস্ত কিছুর যোগফল এবং প্রতিটি কাজের জন্য "অন্যান্য" নামক উত্স গ্রুপে যুক্ত করার উপায় কি থাকবে?
জোড্যাঞ্জার

30
ordersort_valuesপরিবর্তে ব্যবহার
হ্রাস করা

দুর্দান্ত উত্তরের জন্য ধন্যবাদ। আরও একটি পদক্ষেপের জন্য, গ্রুপবাই কলামে মানগুলির উপর ভিত্তি করে বাছাইয়ের আদেশটি নির্ধারণ করার কোনও উপায় থাকবে? উদাহরণস্বরূপ, মানটি 'কিনুন' হলে আরোহণকে বাছাই করুন এবং মানটি 'বিক্রয়' হলে সাজানো সাজানো।
বোভেন লিউ

172

আপনি প্রথমে বাছাই করে এবং প্রতিটি গ্রুপের প্রথম 3 নেওয়ার জন্য মাথা ব্যবহার করেও একসাথে এটি করতে পারেন।

In[34]: df.sort_values(['job','count'],ascending=False).groupby('job').head(3)

Out[35]: 
   count     job source
4      7   sales      E
2      6   sales      C
1      4   sales      B
5      5  market      A
8      4  market      D
6      3  market      B

13
কি groupby, যাতে সংরক্ষিত আছে গ্যারান্টী?
টোটো_টিকো

51
মনে হয় এটি করে; গ্রুপবাইয়ের ডকুমেন্টেশন থেকে : গ্রুপবাই প্রতিটি গ্রুপের মধ্যে সারিগুলির ক্রম সংরক্ষণ করে
টোটো_টিকো

10
টোটো_টিকো- এটি সঠিক, তবে সেই বিবৃতিটি ব্যাখ্যা করার ক্ষেত্রে যত্ন নেওয়া দরকার। একটি একক গ্রুপের সাথে সারিগুলির ক্রম সংরক্ষণ করা আছে, তবে গ্রুপবাইয়ের মধ্যে একটি সাজান = ডিফল্টরূপে সত্য বিবৃতি রয়েছে যার অর্থ গ্রুপগুলি নিজেরাই চাবি অনুসারে বাছাই করা হয়েছে। অন্য কথায় যদি আমার ডেটাফ্রেমে কীগুলি থাকে (ইনপুটটিতে) 3 2 2 1, .. বস্তু অনুসারে গোষ্ঠীটি 1 2 3 ক্রম অনুসারে 3 টি গোষ্ঠী প্রদর্শন করবে (সাজানো)। গোষ্ঠী ক্রম এবং সারি ক্রম সংরক্ষণ করা হয়েছে তা নিশ্চিত করতে বাছাই করুন = মিথ্যা ব্যবহার করুন।
ব্যবহারকারীর 103050

4
মাথা (3) 3 টির বেশি ফলাফল দেয়?
নবীন

27

সাজানো অর্ডারে শীর্ষস্থানীয় 3 নেওয়ার এবং গোষ্ঠীগুলির মধ্যে বাছাই করার অন্যান্য উদাহরণ এখানে রয়েছে:

In [43]: import pandas as pd                                                                                                                                                       

In [44]:  df = pd.DataFrame({"name":["Foo", "Foo", "Baar", "Foo", "Baar", "Foo", "Baar", "Baar"], "count_1":[5,10,12,15,20,25,30,35], "count_2" :[100,150,100,25,250,300,400,500]})

In [45]: df                                                                                                                                                                        
Out[45]: 
   count_1  count_2  name
0        5      100   Foo
1       10      150   Foo
2       12      100  Baar
3       15       25   Foo
4       20      250  Baar
5       25      300   Foo
6       30      400  Baar
7       35      500  Baar


### Top 3 on sorted order:
In [46]: df.groupby(["name"])["count_1"].nlargest(3)                                                                                                                               
Out[46]: 
name   
Baar  7    35
      6    30
      4    20
Foo   5    25
      3    15
      1    10
dtype: int64


### Sorting within groups based on column "count_1":
In [48]: df.groupby(["name"]).apply(lambda x: x.sort_values(["count_1"], ascending = False)).reset_index(drop=True)
Out[48]: 
   count_1  count_2  name
0       35      500  Baar
1       30      400  Baar
2       20      250  Baar
3       12      100  Baar
4       25      300   Foo
5       15       25   Foo
6       10      150   Foo
7        5      100   Foo

9

পরিবর্তে এটি চেষ্টা করুন

'গ্রুপবাই' করার সহজ উপায় এবং অবতরণ অনুসারে বাছাই করা

df.groupby(['companyName'])['overallRating'].sum().sort_values(ascending=False).head(20)

8

আপনার যদি কোনও কলামের যোগফল দরকার না হয় তবে @ টিভিশতারের উত্তরটি ব্যবহার করুন। আপনার যদি যোগফল প্রয়োজন হয়, তবে আপনি @ জোরিস'র উত্তর বা এটির সাথে মিলপূর্ণ এটি ব্যবহার করতে পারেন।

df.groupby(['job']).apply(lambda x: (x.groupby('source')
                                      .sum()
                                      .sort_values('count', ascending=False))
                                     .head(3))
আমাদের সাইট ব্যবহার করে, আপনি স্বীকার করেছেন যে আপনি আমাদের কুকি নীতি এবং গোপনীয়তা নীতিটি পড়েছেন এবং বুঝতে পেরেছেন ।
Licensed under cc by-sa 3.0 with attribution required.