প্যান্ডাস গ্রুপবাই.এইজিজি () ব্যবহার করে একই কলামের একাধিক সমষ্টি


127

একাধিকবার কল না f1, f2করে একই কলামে দুটি পৃথক একীকরণ ফাংশন প্রয়োগ করার জন্য কি অন্তর্নিহিত উপায় রয়েছে ?df["returns"]agg()

ডেটাফ্রেমের উদাহরণ:

import pandas as pd
import datetime as dt

pd.np.random.seed(0)
df = pd.DataFrame({
         "date"    :  [dt.date(2012, x, 1) for x in range(1, 11)], 
         "returns" :  0.05 * np.random.randn(10), 
         "dummy"   :  np.repeat(1, 10)
}) 

সিনথেটিকভাবে ভুল, তবে স্বজ্ঞাতভাবে সঠিক, এটি করার উপায় হ'ল:

# Assume `f1` and `f2` are defined for aggregating.
df.groupby("dummy").agg({"returns": f1, "returns": f2})

স্পষ্টতই, পাইথন নকল কীগুলিকে অনুমতি দেয় না। ইনপুট প্রকাশ করার জন্য অন্য কোনও উপায় আছে agg()? [(column, function)]একই কলামে একাধিক ফাংশন প্রয়োগের অনুমতি দেওয়ার জন্য সম্ভবত টিপলগুলির একটি তালিকা আরও ভালভাবে কাজ করবে? তবে agg()মনে হয় এটি কেবল একটি অভিধানই গ্রহণ করে।

একটি সহায়ক ফাংশন সংজ্ঞায়নের পাশাপাশি এর অভ্যন্তরীণ দুটি কার্যই কেবল প্রয়োগ করে? (যাইহোক এটি কীভাবে সমষ্টি নিয়ে কাজ করবে?)


সম্পর্কিত -
পান্ডায়

2
0.25 এর পরে, পান্ডাস একাধিক সংঘবদ্ধকরণের পাশাপাশি আউটপুট কলামগুলির নাম পরিবর্তনের জন্য আরও স্বজ্ঞাত সিনট্যাক্স সরবরাহ করে। নামযুক্ত সমষ্টিগুলিতে ডকুমেন্টেশন দেখুন ।
cs95

এফওয়াইআই এই প্রশ্নটি
2012-

1
এফওয়াইআই স্বীকৃত উত্তরটিও হ্রাস পেয়েছে - আগ্রাসনটি পাস করবেন না () ডিক্টের একটি ডিক্ট।
cs95

@ সিএস 95: আমি জানি যে এটি অবমূল্যায়ন করা হয়েছে, আমি বলছি এসও পুরানো সংস্করণগুলি থেকে পুরানো বাসি সমাধানগুলিতে আবদ্ধ হয়ে উঠছে। মতামত ব্যতীত - তাই চিহ্নিত করার কোনও উপায় নেই।
স্মি

উত্তর:


159

আপনি কেবল তালিকা হিসাবে ফাংশনগুলি পাস করতে পারেন:

In [20]: df.groupby("dummy").agg({"returns": [np.mean, np.sum]})
Out[20]:         
           mean       sum
dummy                    
1      0.036901  0.369012

বা অভিধান হিসাবে:

In [21]: df.groupby('dummy').agg({'returns':
                                  {'Mean': np.mean, 'Sum': np.sum}})
Out[21]: 
        returns          
           Mean       Sum
dummy                    
1      0.036901  0.369012

4
ফলাফল কলামের নাম নির্দিষ্ট করার কোনও উপায় আছে?
বেন

3
@ আমার মনে হয়েছে আপনার পরে একটি নাম পরিবর্তন করতে হবে। টম অগস্পার্গারের উদাহরণ (সেল 25 দেখুন)
স্টিভবাকা


10
@ স্পার_স্প্রেড একটি তালিকা হিসাবে একাধিক ফাংশন পাস করার বিষয়টি পান্ডাস ডকুমেন্টেশনে ভালভাবে বর্ণনা করা হয়েছে । অভিধান হিসাবে একাধিক ফাংশন নামকরণ এবং পাস করা প্যান্ডসের ভবিষ্যতের সংস্করণে অবচয় করা হবে। বিস্তারিত রয়েছে 0.20 পরিবর্তনের লগ , যা আমি এছাড়াও তাই অন্যত্র সংক্ষিপ্ত
joelostblom

3
এটি ইতিমধ্যে বলা হয়েছে, তবে বয়স থেকে আউটপুট কলামগুলির নামকরণের জন্য অভিধান ব্যবহার করা হ্রাস করা হয়। পরিবর্তে আপনি টিপলগুলির একটি তালিকা নির্দিষ্ট করতে পারেন। এই উত্তর দেখুন।
সিএস 95

101

TLDR; পান্ডাদের groupby.aggএকাধিক কলামে (1) সমষ্টি এবং (2) একটি কলামে একাধিক সমষ্টি নির্দিষ্টকরণের জন্য একটি নতুন, সহজ বাক্য গঠন রয়েছে। সুতরাং, পান্ডাস> = 0.25 এর জন্য এটি করুন

df.groupby('dummy').agg(Mean=('returns', 'mean'), Sum=('returns', 'sum'))

           Mean       Sum
dummy                    
1      0.036901  0.369012

অথবা

df.groupby('dummy')['returns'].agg(Mean='mean', Sum='sum')

           Mean       Sum
dummy                    
1      0.036901  0.369012

পান্ডাস> = 0.25: নামকরণ সমষ্টি

পান্ডগণ GroupBy.aggনামকরণকৃত সংস্থাগুলি নির্দিষ্ট করার জন্য আরও স্বজ্ঞাত সিন্টেক্সের পক্ষে আচরণের পরিবর্তন করেছে । দেখুন উন্নতি উপর 0.25 ডক্স অধ্যায় সেইসাথে প্রাসঙ্গিক GitHub বিষয় GH18366 এবং GH26512

ডকুমেন্টেশন থেকে,

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

  • কীওয়ার্ডগুলি আউটপুট কলামের নাম
  • মানগুলি হ'ল টিপলস যার প্রথম উপাদানটি নির্বাচন করার জন্য কলাম এবং দ্বিতীয় উপাদানটি সেই কলামটিতে প্রয়োগ করার জন্য সমষ্টি। আর্গুমেন্টগুলি কী তা পরিষ্কার করার জন্য পান্ডস পান্ডস সরবরাহ করেন amed যথারীতি, সমষ্টিটি কলযোগ্য বা একটি স্ট্রিং ওরফে হতে পারে।

আপনি এখন কীওয়ার্ড আর্গুমেন্টের মাধ্যমে একটি টুপল পাস করতে পারেন। টিপলগুলি এর ফর্ম্যাটটি অনুসরণ করে (<colName>, <aggFunc>)

import pandas as pd

pd.__version__                                                                                                                            
# '0.25.0.dev0+840.g989f912ee'

# Setup
df = 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]
})

df.groupby('kind').agg(
    max_height=('height', 'max'), min_weight=('weight', 'min'),)

      max_height  min_weight
kind                        
cat          9.5         7.9
dog         34.0         7.5

বিকল্পভাবে, আপনি ব্যবহার করতে পারেন pd.NamedAgg(মূলত একটি নামধারী) যা জিনিসগুলিকে আরও স্পষ্ট করে তোলে।

df.groupby('kind').agg(
    max_height=pd.NamedAgg(column='height', aggfunc='max'), 
    min_weight=pd.NamedAgg(column='weight', aggfunc='min')
)

      max_height  min_weight
kind                        
cat          9.5         7.9
dog         34.0         7.5

এটি সিরিজের পক্ষে আরও সহজ, কেবল একটি কীওয়ার্ড আর্গুমেন্টে অ্যাগগ্রাফকে দিন।

df.groupby('kind')['height'].agg(max_height='max', min_height='min')    

      max_height  min_height
kind                        
cat          9.5         9.1
dog         34.0         6.0       

সবশেষে, যদি আপনার কলামের নামগুলি অজগর সনাক্তকারী না হয় তবে আনপ্যাকিং সহ একটি অভিধান ব্যবহার করুন:

df.groupby('kind')['height'].agg(**{'max height': 'max', ...})

পান্ডা <0.25

0.24 অবধি পাণ্ডাদের আরও সাম্প্রতিক সংস্করণগুলিতে, যদি সংগ্রহের আউটপুটটির জন্য কলামের নাম নির্দিষ্ট করার জন্য অভিধান ব্যবহার করা হয় তবে আপনি একটি পাবেন FutureWarning:

df.groupby('dummy').agg({'returns': {'Mean': 'mean', 'Sum': 'sum'}})
# FutureWarning: using a dict with renaming is deprecated and will be removed 
# in a future version

কলামগুলির নাম বদলে দেওয়ার জন্য অভিধান ব্যবহার করা v0.20-এ অবনতিযুক্ত। পান্ডার সাম্প্রতিক সংস্করণগুলিতে, টিউপসগুলির একটি তালিকা পাস করে এটি আরও সহজভাবে নির্দিষ্ট করা যেতে পারে। যদি এইভাবে ফাংশনগুলি নির্দিষ্ট করে দেওয়া হয় তবে column কলামটির সমস্ত ফাংশনকে (নাম, ফাংশন) জোড়াগুলির টিপলস হিসাবে নির্দিষ্ট করা দরকার।

df.groupby("dummy").agg({'returns': [('op1', 'sum'), ('op2', 'mean')]})

        returns          
            op1       op2
dummy                    
1      0.328953  0.032895

অথবা,

df.groupby("dummy")['returns'].agg([('op1', 'sum'), ('op2', 'mean')])

            op1       op2
dummy                    
1      0.328953  0.032895

4
ইন্টারফেসের নতুন সংস্করণ ব্যবহার করে আরও পরিষ্কার এবং পরিষ্কার সমাধান ব্যবহার করার কারণে এটি শীর্ষস্থানীয় উত্তর হওয়া উচিত।
NKSHELL

নামযুক্ত সংহতকরণের জন্য ব্যবহৃত উদাহরণগুলি একই কলামে একাধিক সমষ্টি ব্যবহারের মূল সমস্যাটি সমাধান করে না। উদাহরণস্বরূপ, আপনি কি সর্বনিম্ন জন্য সর্বনিম্ন এবং সর্বোচ্চ উভয় দ্বারা প্রথম সাবসেটিং ছাড়াই একত্রিত করতে পারেন df.groupby('kind')['height']?
বিজয়ী

1
@ ভিক্টর আমি উত্তরের শীর্ষে একটি টিএলডিআর যুক্ত করেছি যা প্রশ্নের সরাসরি উত্তর দেয়। এবং আপনার দ্বিতীয় প্রশ্নের উত্তর হ্যাঁ, দয়া করে আমার উত্তরটির সম্পাদনাটি একবার দেখুন।
cs95

এই জাতীয় একাধিক কলামগুলিকে হ্যান্ডেল করার জন্য আপনার> = 0.25 জবাবের শেষ উদাহরণে আরও জেনেরিক কোডটি দুর্দান্ত হত। df.groupby("kind").agg(**{ 'max height': pd.NamedAgg(column='height', aggfunc=max), 'min weight': pd.NamedAgg(column='weight', aggfunc=min) })
ওনুর এস

6

এই কাজ ভালো কিছু হবে:

In [7]: df.groupby('dummy').returns.agg({'func1' : lambda x: x.sum(), 'func2' : lambda x: x.prod()})
Out[7]: 
              func2     func1
dummy                        
1     -4.263768e-16 -0.188565

2
না, এটি কাজ করে না। আপনি যদি এর জন্য ডক স্ট্রিংটি লক্ষ্য করেন aggregateতবে স্পষ্টভাবে বলা হয় যে একটি dictপাস করার পরে, কীগুলি অবশ্যই কলামের নাম হওয়া উচিত। সুতরাং হয় আপনার উদাহরণটি এই ত্রুটিটি পরীক্ষা না করে আপনি টাইপ করা এমন কিছু যা অন্যথায় পান্ডারা এখানে তার নিজস্ব ডক্সটি ভেঙে ফেলে।
এলী

এন / এমআই returnsসেখানে অতিরিক্ত কল দেখতে পেল না । সুতরাং এটি কি সমষ্টি সিরিজ সংস্করণ? আমি সমষ্টিটির ডেটা ফ্রেম সংস্করণটি করতে চাইছি এবং আমি প্রতিটি কলামে একবারে একাধিক পৃথক সংযোজন প্রয়োগ করতে চাই।
এলী

1
। এই চেষ্টা করুন: df.groupby ( 'ডামি') agg ({ 'আয়': { 'func1': ল্যামডা X: x.sum (), 'func2': ল্যামডা X: x.mean ()}})
চ্যাং সে

এটি কোনও বার্তা ছাড়াই একটি দৃser়তা ত্রুটি দেয়। কোডটির চেহারা থেকে (pandas.core.internals.py, লাইন 406-408, সংস্করণ 0.7.3) দেখে মনে হচ্ছে এটি প্রথমটির মধ্যে কীগুলির চেয়ে আরও কলামগুলি ফিরিয়েছে না তা নিশ্চিত করার জন্য এটি শেষে একটি চেক করে like সমষ্টি অভিধানের স্তর।
এলী

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