python - সহজ - পাইথন: সারিটি পেয়ে যা গ্রুপবই ব্যবহার করে গোষ্ঠীতে সর্বোচ্চ মান দেয়




সহজ ভাষায় পাইথন ৩ pdf (7)

Zelazny দ্বারা অপেক্ষাকৃত বড় ডাটাফ্রেমে (~ 400k সারি) প্রস্তাবিত সমাধানটি চেষ্টা করে দেখেছি এটি খুব ধীর হয়ে গেছে। এখানে একটি বিকল্প যা আমি আমার ডেটা সেটের উপর তীব্রতার আদেশ চালানোর জন্য খুঁজে পেয়েছি।

df = pd.DataFrame({
    'sp' : ['MM1', 'MM1', 'MM1', 'MM2', 'MM2', 'MM2', 'MM4', 'MM4', 'MM4'],
    'mt' : ['S1', 'S1', 'S3', 'S3', 'S4', 'S4', 'S2', 'S2', 'S2'],
    'val' : ['a', 'n', 'cb', 'mk', 'bg', 'dgb', 'rd', 'cb', 'uyi'],
    'count' : [3,2,5,8,10,1,2,2,7]
    })

df_grouped = df.groupby(['sp', 'mt']).agg({'count':'max'})

df_grouped = df_grouped.reset_index()

df_grouped = df_grouped.rename(columns={'count':'count_max'})

df = pd.merge(df, df_grouped, how='left', on=['sp', 'mt'])

df = df[df['count'] == df['count_max']]

আমি আশা করি আমি আমার প্রশ্নের জন্য সাহায্য পেতে পারি। আমি নিম্নলিখিত সমস্যার জন্য একটি সমাধান অনুসন্ধান করছি:

আমার মত একটি তথ্য ফ্রেম আছে:

 Sp  Mt Value  count
0  MM1  S1   a      **3**
1  MM1  S1   n      2
2  MM1  S3   cb     5
3  MM2  S3   mk      **8**
4  MM2  S4   bg     **10**
5  MM2  S4   dgd      1
6  MM4  S2  rd     2
7  MM4  S2   cb      2
8  MM4  S2   uyi      **7**

আমার উদ্দেশ্য হলো ফলাফলের সারিগুলি, যার গণনাগুলি গোষ্ঠীর মধ্যে সর্বোচ্চ, যেমন:

0  MM1  S1   a      **3**
1 3  MM2  S3   mk      **8**
4  MM2  S4   bg     **10** 
8  MM4  S2   uyi      **7**

কেউ জানেন কিভাবে আমি পাণ্ডাস বা পাইথনে এটা করতে পারি?

হালনাগাদ

আমি আমার প্রশ্নের জন্য আরো বিস্তারিত দিতে না। আমার সমস্যার জন্য, আমি ['স্প', 'Mt'] দ্বারা গ্রুপ করতে চান। এই মত একটি দ্বিতীয় উদাহরণ নিতে দিন:

   Sp   Mt   Value  count
4  MM2  S4   bg     10
5  MM2  S4   dgd    1
6  MM4  S2   rd     2
7  MM4  S2   cb     8
8  MM4  S2   uyi    8

উপরের উদাহরণের জন্য, আমি সমস্ত সারি পেতে চাই যেখানে গণনা প্রতিটি গ্রুপে সর্বোচ্চ সমান হয় যেমন:

MM2  S4   bg     10
MM4  S2   cb     8
MM4  S2   uyi    8

আপনি sort_values + drop_duplicates ব্যবহার করে, দলের সাথে করতে হবে না

df.sort_values('count').drop_duplicates(['Sp','Mt'],keep='last')
Out[190]: 
    Sp  Mt Value  count
0  MM1  S1     a      3
2  MM1  S3    cb      5
8  MM4  S2   uyi      7
3  MM2  S3    mk      8
4  MM2  S4    bg     10

tail ব্যবহার করে প্রায় একই যুক্তি

df.sort_values('count').groupby(['Sp', 'Mt']).tail(1)
Out[52]: 
    Sp  Mt Value  count
0  MM1  S1     a      3
2  MM1  S3    cb      5
8  MM4  S2   uyi      7
3  MM2  S3    mk      8
4  MM2  S4    bg     10

আমার জন্য, গণনা সর্বাধিক সমান যখন সবচেয়ে সহজ সমাধান মান রাখা হবে। অতএব, নিম্নলিখিত এক লাইন কমান্ড যথেষ্ট:

df[df['count'] == df.groupby(['Mt'])['count'].transform(max)]

আমি অনেক গ্রুপ ক্রিয়াকলাপের জন্য এই কার্যকরী শৈলী ব্যবহার করা হয়েছে:

df = pd.DataFrame({
   'Sp' : ['MM1', 'MM1', 'MM1', 'MM2', 'MM2', 'MM2', 'MM4', 'MM4', 'MM4'],
   'Mt' : ['S1', 'S1', 'S3', 'S3', 'S4', 'S4', 'S2', 'S2', 'S2'],
   'Val' : ['a', 'n', 'cb', 'mk', 'bg', 'dgb', 'rd', 'cb', 'uyi'],
   'Count' : [3,2,5,8,10,1,2,2,7]
})

df.groupby('Mt')\
  .apply(lambda group: group[group.Count == group.Count.max()])\
  .reset_index(drop=True)

    sp  mt  val  count
0  MM1  S1    a      3
1  MM4  S2  uyi      7
2  MM2  S3   mk      8
3  MM2  S4   bg     10

.reset_index(drop=True) আপনি গোষ্ঠী-সূচীটি ড্রপ করে আসল সূচীতে ফিরে যান।


groupby এবং idxmax পদ্ধতি ব্যবহার করুন:

  1. datetime কল করুন date :

    df['date']=pd.to_datetime(df['date'])
  2. groupyby ad_id পরে কলাম date max সূচী পেতে groupyby ad_id :

    idx=df.groupby(by='ad_id')['date'].idxmax()
  3. চেয়েছিলেন তথ্য পেতে:

    df_max=df.loc[idx,]

আউট [54]:

ad_id  price       date
7     22      2 2018-06-11
6     23      2 2018-06-22
2     24      2 2018-06-30
3     28      5 2018-06-22

Groupby বস্তুতে "প্রয়োগ করা" "নেদারগারেস্ট" অনুমান করা ঠিক সূক্ষ্ম হিসাবে কাজ করে:

অতিরিক্ত সুবিধা - প্রয়োজনে উপরের এন মানগুলিও আনতে পারে :

In [85]: import pandas as pd

In [86]: df = pd.DataFrame({
    ...: 'sp' : ['MM1', 'MM1', 'MM1', 'MM2', 'MM2', 'MM2', 'MM4', 'MM4','MM4'],
    ...: 'mt' : ['S1', 'S1', 'S3', 'S3', 'S4', 'S4', 'S2', 'S2', 'S2'],
    ...: 'val' : ['a', 'n', 'cb', 'mk', 'bg', 'dgb', 'rd', 'cb', 'uyi'],
    ...: 'count' : [3,2,5,8,10,1,2,2,7]
    ...: })

## Apply nlargest(1) to find the max val df, and nlargest(n) gives top n values for df:
In [87]: df.groupby(["sp", "mt"]).apply(lambda x: x.nlargest(1, "count")).reset_index(drop=True)
Out[87]:
   count  mt   sp  val
0      3  S1  MM1    a
1      5  S3  MM1   cb
2      8  S3  MM2   mk
3     10  S4  MM2   bg
4      7  S2  MM4  uyi

In [1]: df
Out[1]:
    Sp  Mt Value  count
0  MM1  S1     a      3
1  MM1  S1     n      2
2  MM1  S3    cb      5
3  MM2  S3    mk      8
4  MM2  S4    bg     10
5  MM2  S4   dgd      1
6  MM4  S2    rd      2
7  MM4  S2    cb      2
8  MM4  S2   uyi      7

In [2]: df.groupby(['Mt'], sort=False)['count'].max()
Out[2]:
Mt
S1     3
S3     8
S4    10
S2     7
Name: count

আসল ডিএফের সূচকগুলি পেতে আপনি যা করতে পারেন:

In [3]: idx = df.groupby(['Mt'])['count'].transform(max) == df['count']

In [4]: df[idx]
Out[4]:
    Sp  Mt Value  count
0  MM1  S1     a      3
3  MM2  S3    mk      8
4  MM2  S4    bg     10
8  MM4  S2   uyi      7

মনে রাখবেন যদি আপনার প্রতি গ্রুপে একাধিক সর্বোচ্চ মান থাকে, তবে সবগুলি ফিরে আসবে।

হালনাগাদ

একটি শিলা মেরি সুযোগ যে এই হল অপারেটিং সিস্টেম অনুরোধ করা হয়:

In [5]: df['count_max'] = df.groupby(['Mt'])['count'].transform(max)

In [6]: df
Out[6]:
    Sp  Mt Value  count  count_max
0  MM1  S1     a      3          3
1  MM1  S1     n      2          3
2  MM1  S3    cb      5          8
3  MM2  S3    mk      8          8
4  MM2  S4    bg     10         10
5  MM2  S4   dgd      1         10
6  MM4  S2    rd      2          7
7  MM4  S2    cb      2          7
8  MM4  S2   uyi      7          7






pandas