একাধিক গ্রুপবাই কলামগুলিতে একাধিক ফাংশন প্রয়োগ করুন


221

ডক্স কিভাবে কী হিসেবে আউটপুট কলাম নামের সাথে একটি অভি ব্যবহার করে একটি সময়ে একটি groupby বস্তুর উপর একাধিক ফাংশন প্রয়োগ করতে দেন:

In [563]: grouped['D'].agg({'result1' : np.sum,
   .....:                   'result2' : np.mean})
   .....:
Out[563]: 
      result2   result1
A                      
bar -0.579846 -1.739537
foo -0.280588 -1.402938

তবে এটি কেবল সিরিজ গ্রুপবাই অবজেক্টে কাজ করে। এবং যখন ডিক একইভাবে একটি গ্রুপবাই ডেটাফ্রেমে স্থানান্তরিত হয়, তখন এটি কীগুলি কলামের নাম হিসাবে প্রত্যাশায় ফাংশনটি প্রয়োগ করা হবে।

আমি যা করতে চাই তা হ'ল কয়েকটি কলামগুলিতে একাধিক ফাংশন প্রয়োগ করা (তবে নির্দিষ্ট কলামগুলি একাধিকবার পরিচালিত হবে)। এছাড়াও, কিছু ফাংশন গ্রুপবাই অবজেক্টের অন্যান্য কলামগুলির উপর নির্ভর করবে (যেমন সামিফ ফাংশন)। আমার বর্তমান সমাধানটি কলাম অনুসারে কলামে যাওয়া এবং উপরের কোডের মতো কিছু করা, অন্যান্য সারিগুলির উপর নির্ভরশীল ফাংশনগুলির জন্য ল্যাম্বডাস ব্যবহার করা। তবে এটি একটি দীর্ঘ সময় নিচ্ছে, (আমার মনে হয় একটি গ্রুপবাইয়ের মাধ্যমে কোনও পুনরুক্তি করতে অনেক সময় লাগে)। আমাকে এটিকে পরিবর্তন করতে হবে যাতে আমি একক রানে পুরো গ্রুপবাইয়ের মাধ্যমে পুনরাবৃত্তি করতে পারি, তবে আমি ভাবছি যে এটি কিছুটা পরিষ্কারভাবে করার জন্য পান্ডাসের মতো কোনও বিল্ড ইন আছে।

উদাহরণস্বরূপ, আমি এরকম কিছু চেষ্টা করেছি

grouped.agg({'C_sum' : lambda x: x['C'].sum(),
             'C_std': lambda x: x['C'].std(),
             'D_sum' : lambda x: x['D'].sum()},
             'D_sumifC3': lambda x: x['D'][x['C'] == 3].sum(), ...)

তবে প্রত্যাশা অনুযায়ী আমি কী-এরর পেয়েছি (যেহেতু ডেটা ফ্রেম থেকে চাওয়া হলে কীগুলি একটি কলাম হতে হবে agg)।

আমি যা করতে চাই তাতে করার মতো কোনও বিলম্বিত কি আছে, বা এই কার্যকারিতাটি যুক্ত হওয়ার সম্ভাবনা রয়েছে, বা আমাকে নিজেই গ্রুপবাই দিয়ে নিজেই পুনরাবৃত্তি করতে হবে?

ধন্যবাদ


2
যদি আপনি এই প্রশ্নটিতে 2017+ এ চলে আসছেন তবে একাধিক কলাম একসাথে একত্রিত করার অভিব্যক্তিক উপায়টি দেখতে নীচের উত্তরটি দেখুন । বর্তমানে নির্বাচিত উত্তরের এতে একাধিক অবমূল্যায়ন রয়েছে, যথা আপনি একটি গ্রুপবাইয়ের ফলস্বরূপ কলামগুলির নাম পরিবর্তন করতে এখন আর অভিধানের অভিধান ব্যবহার করতে পারবেন না।
টেড পেট্রো

উত্তর:


282

বর্তমানে গৃহীত উত্তরের দ্বিতীয়ার্ধটি পুরানো এবং এতে দুটি অবমূল্যায়ন রয়েছে। প্রথম এবং সর্বাধিক গুরুত্বপূর্ণ, আপনি আর aggগ্রুপবাটি পদ্ধতিতে অভিধানের একটি অভিধান পাস করতে পারবেন না । দ্বিতীয়ত, কখনও ব্যবহার করবেন না .ix

আপনি যদি একই সাথে দুটি পৃথক কলামের সাথে কাজ করতে চান তবে আমি সেই applyপদ্ধতিটি ব্যবহার করার পরামর্শ দেব যা স্পষ্টভাবে প্রয়োগ ফাংশনে একটি ডেটা ফ্রেমকে পাস করবে। উপরের মতো একটি অনুরূপ ডেটাফ্রেম ব্যবহার করা যাক

df = pd.DataFrame(np.random.rand(4,4), columns=list('abcd'))
df['group'] = [0, 0, 1, 1]
df

          a         b         c         d  group
0  0.418500  0.030955  0.874869  0.145641      0
1  0.446069  0.901153  0.095052  0.487040      0
2  0.843026  0.936169  0.926090  0.041722      1
3  0.635846  0.439175  0.828787  0.714123      1

সমষ্টি ফাংশনে কলামের নামগুলি থেকে ম্যাপ করা একটি অভিধান এখনও একটি সমষ্টি সম্পাদন করার উপযুক্ত উপায়।

df.groupby('group').agg({'a':['sum', 'max'], 
                         'b':'mean', 
                         'c':'sum', 
                         'd': lambda x: x.max() - x.min()})

              a                   b         c         d
            sum       max      mean       sum  <lambda>
group                                                  
0      0.864569  0.446069  0.466054  0.969921  0.341399
1      1.478872  0.843026  0.687672  1.754877  0.672401

যদি আপনি সেই কুৎসিত ল্যাম্বদা কলামের নামটি পছন্দ না করেন তবে আপনি একটি সাধারণ ক্রিয়াকলাপ ব্যবহার করতে পারেন এবং বিশেষ __name__বৈশিষ্ট্যের জন্য একটি কাস্টম নাম সরবরাহ করতে পারেন :

def max_min(x):
    return x.max() - x.min()

max_min.__name__ = 'Max minus Min'

df.groupby('group').agg({'a':['sum', 'max'], 
                         'b':'mean', 
                         'c':'sum', 
                         'd': max_min})

              a                   b         c             d
            sum       max      mean       sum Max minus Min
group                                                      
0      0.864569  0.446069  0.466054  0.969921      0.341399
1      1.478872  0.843026  0.687672  1.754877      0.672401

applyএকটি সিরিজ ব্যবহার এবং ফিরে

এখন, আপনার যদি একাধিক কলাম রয়েছে যার একসাথে ইন্টারঅ্যাক্ট করার দরকার পড়েছিল তবে আপনি ব্যবহার করতে পারবেন না agg, যা স্পষ্টতই সিরিজটিকে একত্রিত ফাংশনে পাস করে। applyডেটাফ্রেম হিসাবে পুরো গ্রুপটি ব্যবহার করার সময় ফাংশনটিতে চলে যায়।

আমি একটি একক কাস্টম ফাংশন করার পরামর্শ দিচ্ছি যা সমস্ত সমষ্টিগুলির একটি সিরিজ দেয়। নতুন কলামগুলির জন্য লেবেল হিসাবে সিরিজ সূচকটি ব্যবহার করুন:

def f(x):
    d = {}
    d['a_sum'] = x['a'].sum()
    d['a_max'] = x['a'].max()
    d['b_mean'] = x['b'].mean()
    d['c_d_prodsum'] = (x['c'] * x['d']).sum()
    return pd.Series(d, index=['a_sum', 'a_max', 'b_mean', 'c_d_prodsum'])

df.groupby('group').apply(f)

         a_sum     a_max    b_mean  c_d_prodsum
group                                           
0      0.864569  0.446069  0.466054     0.173711
1      1.478872  0.843026  0.687672     0.630494

আপনি যদি মাল্টিআইডেক্সের সাথে প্রেম করেন তবে আপনি এখনও এর মতো একটি দিয়ে একটি সিরিজ ফিরে আসতে পারেন:

    def f_mi(x):
        d = []
        d.append(x['a'].sum())
        d.append(x['a'].max())
        d.append(x['b'].mean())
        d.append((x['c'] * x['d']).sum())
        return pd.Series(d, index=[['a', 'a', 'b', 'c_d'], 
                                   ['sum', 'max', 'mean', 'prodsum']])

df.groupby('group').apply(f_mi)

              a                   b       c_d
            sum       max      mean   prodsum
group                                        
0      0.864569  0.446069  0.466054  0.173711
1      1.478872  0.843026  0.687672  0.630494

3
আমি একটি ক্রিয়াকলাপ ব্যবহার করে এমন ধারাটি পছন্দ করি যা একটি সিরিজ দেয়। খুব ঝরঝরে.
স্টিফেন ম্যাকএটিয়ার

2
একাধিক কলাম ইনপুট সিমুলেটনিওসালি (উপরের সি_ডি উদাহরণ) এর মাধ্যমে ডেটাফ্রেমকে একত্রিত করার জন্য আমি একমাত্র এই পথটি পেয়েছি
ব্লেক

2
আমি ফলাফলগুলি দ্বারা বিভ্রান্ত হয়েছি, aগ্রুপের মধ্যে সংক্ষেপ গ্রহণ করে এটি 0হওয়া উচিত নয় 0.418500 + 0.446069 = 0.864569? অন্যান্য কক্ষের ক্ষেত্রেও এটি একই রকম, সংখ্যাগুলি যোগ হতে দেখা যাচ্ছে না। এটি পরবর্তী উদাহরণগুলিতে কিছুটা আলাদা অন্তর্নিহিত ডেটাফ্রেম ব্যবহার করা যেতে পারে?
স্ল্যাকলাইন

রেকর্ডের সংখ্যা দেখতে আমি প্রায়শই একটি গ্রুপবাইয়ের সাথে .size () ব্যবহার করি। আগ্রাসন: ডিক্ট পদ্ধতি ব্যবহার করে এটি করার কোনও উপায় আছে কি? আমি বুঝতে পারি আমি একটি নির্দিষ্ট ক্ষেত্র গণনা করতে পারি, তবে আমার পছন্দটি গণনাটি ক্ষেত্র-স্বাধীন হতে হবে।
ক্রিস ডেকার

1
@ স্ল্যাকলাইন হ্যাঁ আমি এটি পরীক্ষা করেছি এবং এটি ঠিক কাজ করে। টেড অবশ্যই ফ্রেমটি কয়েকবার আলাদাভাবে তৈরি করেছে এবং যেহেতু এটি এলোমেলো সংখ্যা জেনারেশনের মাধ্যমে তৈরি করা হয়েছিল, তাই ডেটা তথ্য তৈরির জন্য ডেটা তথ্য চূড়ান্তভাবে গণনার ক্ষেত্রে ব্যবহৃত একের চেয়ে আলাদা ছিল
লুকাশ এইচ

166

প্রথম অংশের জন্য আপনি কীগুলির জন্য কলামের নামগুলি এবং মানগুলির জন্য ফাংশনগুলির একটি তালিকা পাস করতে পারেন:

In [28]: df
Out[28]:
          A         B         C         D         E  GRP
0  0.395670  0.219560  0.600644  0.613445  0.242893    0
1  0.323911  0.464584  0.107215  0.204072  0.927325    0
2  0.321358  0.076037  0.166946  0.439661  0.914612    1
3  0.133466  0.447946  0.014815  0.130781  0.268290    1

In [26]: f = {'A':['sum','mean'], 'B':['prod']}

In [27]: df.groupby('GRP').agg(f)
Out[27]:
            A                   B
          sum      mean      prod
GRP
0    0.719580  0.359790  0.102004
1    0.454824  0.227412  0.034060

আপডেট 1:

সামগ্রিক ফাংশন সিরিজে কাজ করার কারণে, অন্যান্য কলামের নামের উল্লেখ হারিয়ে গেছে। এটি পেতে, আপনি লম্বদা ফাংশনটির মধ্যে গোষ্ঠী সূচকগুলি ব্যবহার করে সম্পূর্ণ ডেটাফ্রেমটি উল্লেখ করতে এবং সূচিকরণ করতে পারেন।

এখানে একটি হ্যাকি কাজ আছে:

In [67]: f = {'A':['sum','mean'], 'B':['prod'], 'D': lambda g: df.loc[g.index].E.sum()}

In [69]: df.groupby('GRP').agg(f)
Out[69]:
            A                   B         D
          sum      mean      prod  <lambda>
GRP
0    0.719580  0.359790  0.102004  1.170219
1    0.454824  0.227412  0.034060  1.182901

এখানে, ফলস্বরূপ 'ডি' কলামটি 'ই' মানগুলি দিয়ে তৈরি।

আপডেট 2:

এখানে এমন একটি পদ্ধতি রয়েছে যা আমি মনে করি আপনি যা বলবেন তা করবে। প্রথমে একটি কাস্টম ল্যাম্বদা ফাংশন তৈরি করুন। নীচে, জি গ্রুপ উল্লেখ করে। সমষ্টি করার সময়, জি একটি সিরিজ হবে। ডিএফ থেকে বর্তমান গ্রুপটি নির্বাচন করতে পাস g.indexকরা df.ix[]। আমি তারপরে কলাম সিটি 0.5 এর চেয়ে কম কিনা পরীক্ষা করি test ফিরে আসা বুলিয়ান সিরিজটি পাস করা হয়েছে g[]যা মানদণ্ডগুলি পূরণ করে কেবল সেই সারিগুলি নির্বাচন করে।

In [95]: cust = lambda g: g[df.loc[g.index]['C'] < 0.5].sum()

In [96]: f = {'A':['sum','mean'], 'B':['prod'], 'D': {'my name': cust}}

In [97]: df.groupby('GRP').agg(f)
Out[97]:
            A                   B         D
          sum      mean      prod   my name
GRP
0    0.719580  0.359790  0.102004  0.204072
1    0.454824  0.227412  0.034060  0.570441

আকর্ষণীয়, আমি {funcname: func}আমার কাস্টম নাম রাখার জন্য তালিকার পরিবর্তে মান হিসাবে একটি ডিক পাসও করতে পারি। তবে উভয় ক্ষেত্রেই আমি lambdaঅন্য কলামগুলি ব্যবহার করে এমন একটি পাস করতে পারি না (যেমন lambda x: x['D'][x['C'] < 3].sum()উপরে: "কী-এরর: 'ডি'")। কোন ধারণা কি সম্ভব?
দাড়ি

আমি ঠিক এটি করার চেষ্টা করেছি, এবং আমি ত্রুটিটি KeyError: 'D'
পেয়েছি

শীতল, আমি এটি কাজ করতে পেলাম df['A'].ix[g.index][df['C'] < 0].sum()। এটি বেশ নোংরামি পেতে শুরু করেছে, যদিও - আমি মনে করি পাঠ্যতার জন্য ম্যানুয়াল লুপিং পছন্দনীয় হতে পারে, এবং আমি নিশ্চিত নই যে এটি aggযুক্তির (আমার পরিবর্তে <lambda>) আমার পছন্দের নাম দেওয়ার কোনও উপায় আছে । আমি আশা রাখি যে কেউ হয়তো আরও সোজা উপায় জানতে পারে ...
দাড়ি

3
আপনি কলাম মানটির জন্য একটি ডিক পাস করতে পারেন {'D': {'my name':lambda function}}এবং এটি ভিতরের ডিকটি কলামের নামটি তৈরি করে দেবে।
Zelazny7

1
আমি বিশ্বাস করি যে পান্ডাগুলি এখন গ্রুপ-ভিত্তিতে ডেটাফ্রেমে প্রয়োগ করা একাধিক ফাংশন সমর্থন করে: pandas.pydata.org/pandas-docs/stable/…
IanS

22

টেড পেট্রোয়ের উত্তরের বিকল্প হিসাবে (বেশিরভাগ নান্দনিকতার উপরে), আমি খুঁজে পেলাম যে আমি আরও কিছুটা কমপ্যাক্ট তালিকা পছন্দ করেছি। দয়া করে এটি গ্রহণ করার বিষয়টি বিবেচনা করবেন না, এটি টেডের উত্তর, প্লাস কোড / ডেটা সম্পর্কে কেবলমাত্র একটি আরও বিস্তারিত মন্তব্য। পাইথন / পান্ডাস আমার প্রথম / সেরা নয়, তবে আমি এটি ভালভাবে পড়তে পেয়েছি:

df.groupby('group') \
  .apply(lambda x: pd.Series({
      'a_sum'       : x['a'].sum(),
      'a_max'       : x['a'].max(),
      'b_mean'      : x['b'].mean(),
      'c_d_prodsum' : (x['c'] * x['d']).sum()
  })
)

          a_sum     a_max    b_mean  c_d_prodsum
group                                           
0      0.530559  0.374540  0.553354     0.488525
1      1.433558  0.832443  0.460206     0.053313

আমি এটি dplyrপাইপ এবং data.tableশৃঙ্খলিত কমান্ডগুলির আরও স্মরণ করিয়ে দিচ্ছি । তারা আরও ভাল, আমার সাথে আরও পরিচিত তা বলার অপেক্ষা রাখে না। (আমি অবশ্যই শক্তিকে স্বীকৃতি দিয়েছি এবং অনেকের কাছেই defএই ধরণের অপারেশনের জন্য আরও আনুষ্ঠানিক ফাংশনগুলি ব্যবহার করার পছন্দ This এটি কেবলমাত্র একটি বিকল্প, প্রয়োজনের চেয়ে ভাল নয়))


টেডের মতোই আমি ডেটা তৈরি করেছি, আমি পুনরুত্পাদনযোগ্যতার জন্য একটি বীজ যুক্ত করব।

import numpy as np
np.random.seed(42)
df = pd.DataFrame(np.random.rand(4,4), columns=list('abcd'))
df['group'] = [0, 0, 1, 1]
df

          a         b         c         d  group
0  0.374540  0.950714  0.731994  0.598658      0
1  0.156019  0.155995  0.058084  0.866176      0
2  0.601115  0.708073  0.020584  0.969910      1
3  0.832443  0.212339  0.181825  0.183405      1

2
আমি এই উত্তরটি সবচেয়ে পছন্দ করি। এটি আর-তে ডিপ্লাইর পাইপগুলির অনুরূপ
রেনহুই

18

Pandas >= 0.25.0নামকরণ করা সমষ্টি

পান্ডাস সংস্করণ 0.25.0বা ততোধিক সংস্করণ থেকে আমরা অভিধান ভিত্তিক সমষ্টি এবং নতুন নামকরণ থেকে সরে যাচ্ছি, এবং নামকৃত সংস্থাগুলির দিকে এগিয়ে যা যা গ্রহণ করে tuple। এখন আমরা একযোগে আরও তথ্যমূলক কলামের নাম + একত্রে পুনরায় নামকরণ করতে পারি:

উদাহরণ :

df = pd.DataFrame(np.random.rand(4,4), columns=list('abcd'))
df['group'] = [0, 0, 1, 1]

          a         b         c         d  group
0  0.521279  0.914988  0.054057  0.125668      0
1  0.426058  0.828890  0.784093  0.446211      0
2  0.363136  0.843751  0.184967  0.467351      1
3  0.241012  0.470053  0.358018  0.525032      1

GroupBy.aggনামযুক্ত সমষ্টি সহ প্রয়োগ করুন :

df.groupby('group').agg(
             a_sum=('a', 'sum'),
             a_mean=('a', 'mean'),
             b_mean=('b', 'mean'),
             c_sum=('c', 'sum'),
             d_range=('d', lambda x: x.max() - x.min())
)

          a_sum    a_mean    b_mean     c_sum   d_range
group                                                  
0      0.947337  0.473668  0.871939  0.838150  0.320543
1      0.604149  0.302074  0.656902  0.542985  0.057681

আমি এই নামযুক্ত সমষ্টিগুলি পছন্দ করি তবে আমি দেখতে পেলাম না যে কীভাবে আমরা একাধিক কলাম দিয়ে এগুলি ব্যবহার করব?
সাইমন উডহেড

ভাল প্রশ্ন, এটি বের করতে পারেনি, সন্দেহ এটি সম্ভব (এখনও)। আমি এই জন্য একটি টিকিট খোলা । আমার প্রশ্ন রাখবে এবং আপনি আপডেট। @ সিমনউডহেডকে নির্দেশ করার জন্য ধন্যবাদ
এরফান

4

0.25.0 সংস্করণে নতুন।

আউটপুট কলামের নামগুলির উপর নিয়ন্ত্রণের সাথে কলাম-নির্দিষ্ট একীকরণকে সমর্থন করার জন্য, পান্ডাস গ্রুপবিই.এগজি () -র বিশেষ সিনট্যাক্স গ্রহণ করে , যেখানে "নামকরণের সমষ্টি" নামে পরিচিত , যেখানে

  • কীওয়ার্ডগুলি আউটপুট কলামের নাম
  • মানগুলি হ'ল টিপলস যার প্রথম উপাদানটি নির্বাচন করার জন্য কলাম এবং দ্বিতীয় উপাদানটি সেই কলামটিতে প্রয়োগ করার জন্য সমষ্টি। আর্গুমেন্টগুলি কী তা পরিষ্কার করার জন্য পান্ডস পান্ডস সরবরাহ করেন N নামড অ্যাগ নামের ক্ষেত্রগুলি ['কলাম', 'অগ্ফঙ্ক'] সহ। যথারীতি, সমষ্টিটি কলযোগ্য বা একটি স্ট্রিং ওরফে হতে পারে।
    In [79]: animals = pd.DataFrame({'kind': ['cat', 'dog', 'cat', 'dog'],
       ....:                         'height': [9.1, 6.0, 9.5, 34.0],
       ....:                         'weight': [7.9, 7.5, 9.9, 198.0]})
       ....: 

    In [80]: animals
    Out[80]: 
      kind  height  weight
    0  cat     9.1     7.9
    1  dog     6.0     7.5
    2  cat     9.5     9.9
    3  dog    34.0   198.0

    In [81]: animals.groupby("kind").agg(
       ....:     min_height=pd.NamedAgg(column='height', aggfunc='min'),
       ....:     max_height=pd.NamedAgg(column='height', aggfunc='max'),
       ....:     average_weight=pd.NamedAgg(column='weight', aggfunc=np.mean),
       ....: )
       ....: 
    Out[81]: 
          min_height  max_height  average_weight
    kind                                        
    cat          9.1         9.5            8.90
    dog          6.0        34.0          102.75

pandas.NamedAgg সবেমাত্র নামমাত্র t সরল tuples পাশাপাশি অনুমোদিত।

    In [82]: animals.groupby("kind").agg(
       ....:     min_height=('height', 'min'),
       ....:     max_height=('height', 'max'),
       ....:     average_weight=('weight', np.mean),
       ....: )
       ....: 
    Out[82]: 
          min_height  max_height  average_weight
    kind                                        
    cat          9.1         9.5            8.90
    dog          6.0        34.0          102.75

অতিরিক্ত কীওয়ার্ড আর্গুমেন্টগুলি সমষ্টি ফাংশনগুলিতে প্রেরণ করা হয় না। কেবলমাত্র (কলাম, অগ্ফঙ্ক) এর জোড়া ** কোয়ার্গস হিসাবে পাস করতে হবে। যদি আপনার একীকরণ ফাংশনগুলিতে অতিরিক্ত যুক্তিগুলির প্রয়োজন হয় তবে আংশিকভাবে এগুলি functools.partial () দিয়ে প্রয়োগ করুন।

নামযুক্ত সমষ্টিটি গ্রুপ সিরিজ সমষ্টিগুলির জন্যও বৈধ। এই ক্ষেত্রে কোনও কলাম নির্বাচন নেই, সুতরাং মানগুলি কেবলমাত্র ফাংশন।

    In [84]: animals.groupby("kind").height.agg(
       ....:     min_height='min',
       ....:     max_height='max',
       ....: )
       ....: 
    Out[84]: 
          min_height  max_height
    kind                        
    cat          9.1         9.5
    dog          6.0        34.0

3

টেডের উত্তরটি আশ্চর্যজনক। যদি কেউ আগ্রহী হয় তবে আমি এর একটি ছোট সংস্করণ ব্যবহার করে শেষ করেছি। আপনি যখন একাধিক কলামের মানগুলির উপর নির্ভর করে এমন একত্রিতকরণের সন্ধান করছেন তখন দরকারী:

একটি ডেটা ফ্রেম তৈরি করুন

df=pd.DataFrame({'a': [1,2,3,4,5,6], 'b': [1,1,0,1,1,0], 'c': ['x','x','y','y','z','z']})


   a  b  c
0  1  1  x
1  2  1  x
2  3  0  y
3  4  1  y
4  5  1  z
5  6  0  z

গোষ্ঠীকরণ এবং প্রয়োগের সাথে একত্রিত করা (একাধিক কলাম ব্যবহার করে)

df.groupby('c').apply(lambda x: x['a'][(x['a']>1) & (x['b']==1)].mean())

c
x    2.0
y    4.0
z    5.0

গোষ্ঠীকরণ এবং সমষ্টি সহ একত্রিত করা (একাধিক কলাম ব্যবহার করে)

আমি এই পদ্ধতির পছন্দ করি যেহেতু আমি এখনও সামগ্রিক ব্যবহার করতে পারি। সম্ভবত লোকেরা আমাকে জানাতে হবে যে গ্রুপগুলিতে একীকরণ করার সময় একাধিক কলামে আসার জন্য কেন আবেদন প্রয়োজন।

এটি এখন সুস্পষ্ট বলে মনে হচ্ছে, তবে যতক্ষণ না আপনি সরাসরি গ্রুপবাইয়ের পরে আগ্রহের কলামটি নির্বাচন করবেন না , আপনার একীকরণ ফাংশনের মধ্যে থেকে আপনার ডেটাফ্রেমের সমস্ত কলামে অ্যাক্সেস থাকবে।

শুধুমাত্র নির্বাচিত কলামে অ্যাক্সেস

df.groupby('c')['a'].aggregate(lambda x: x[x>1].mean())

নির্বাচন সমস্ত যাদু পরে যেহেতু সমস্ত কলামে অ্যাক্সেস

df.groupby('c').aggregate(lambda x: x[(x['a']>1) & (x['b']==1)].mean())['a']

বা একইভাবে

df.groupby('c').aggregate(lambda x: x['a'][(x['a']>1) & (x['b']==1)].mean())

আশা করি এটা কাজে লাগবে.

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