গোষ্ঠী অনুসারে পান্ডাস যোগফল, তবে নির্দিষ্ট কলামগুলি বাদ দেয়


89

পান্ডস ডেটাফ্রেমে একটি গ্রুপবাই করার সর্বোত্তম উপায় কী তবে সেই গ্রুপবাই থেকে কিছু কলাম বাদ দেওয়া উচিত? উদাহরণস্বরূপ আমার কাছে নিম্নলিখিত ডেটাফ্রেম রয়েছে:

Code   Country      Item_Code   Item    Ele_Code    Unit    Y1961    Y1962   Y1963
2      Afghanistan  15          Wheat   5312        Ha      10       20      30
2      Afghanistan  25          Maize   5312        Ha      10       20      30
4      Angola       15          Wheat   7312        Ha      30       40      50
4      Angola       25          Maize   7312        Ha      30       40      50

আমি দেশ এবং আইটেম_ কোড কলামটি গোষ্ঠীভুক্ত করতে চাই এবং কেবল Y1961, Y1962 এবং Y1963 কলামের অধীনে থাকা সারিগুলির যোগফল গণনা করতে চাই। ফলস্বরূপ ডেটাফ্রেমটি দেখতে এমন হওয়া উচিত:

Code   Country      Item_Code   Item    Ele_Code    Unit    Y1961    Y1962   Y1963
2      Afghanistan  15          C3      5312        Ha      20       40       60
4      Angola       25          C4      7312        Ha      60       80      100

এখনই আমি এটি করছি:

df.groupby('Country').sum()

তবে এটি আইটেম_কোড কলামের পাশাপাশি মানগুলি যুক্ত করে। sum()অপারেশনে কোন কলামগুলি অন্তর্ভুক্ত করতে হবে এবং কোনটি বাদ দিতে হবে তার কোনও উপায় আছে কি ?

উত্তর:


120

আপনি একটি গ্রুপবাইয়ের কলামগুলি নির্বাচন করতে পারেন:

In [11]: df.groupby(['Country', 'Item_Code'])[["Y1961", "Y1962", "Y1963"]].sum()
Out[11]:
                       Y1961  Y1962  Y1963
Country     Item_Code
Afghanistan 15            10     20     30
            25            10     20     30
Angola      15            30     40     50
            25            30     40     50

নোট করুন যে পাস করা তালিকাটি অবশ্যই কলামগুলির একটি উপসেট হতে হবে অন্যথায় আপনি কী-এরর দেখতে পাবেন।


4
কীভাবে প্রতিটি দেশের জন্য রেকর্ডের গণনা এবং আইটেম কোডটিকে অন্য কলাম হিসাবে অন্তর্ভুক্ত করা যায়?
সুশান্ত কুলকারনী

এই মাত্র 1 টি দ্বারা গ্রুপিংয়ের আগে আপনি একটি ডামি কলাম তৈরি করতে পারেন 1 তারপরে একটি গণনা তৈরি করা লোকদের যোগফল যোগ করবে।
ম্যাট ডব্লিউ।

আপনি যদি কেবল একটি বা দুটি কলাম বাদ দিতে চান তবে আপনি সমস্ত কলামের নাম পেয়ে listColumns = list(df.columns)যাবেন তারপরে আপনি যে কলামগুলি চান না তা সরিয়ে ফেলুন listColumns.remove('Y1964')এবং শেষ পর্যন্ত আপনার সংক্ষেপণটি করুন:df.groupby(['Country', 'Item_Code'])[listColumns].sum()
রবার্তো স্টেলিং

অনেক ধন্যবাদ. আমি গ্রুপপ্লেতে কাজ করতে পারি, তবে নির্বাচনের অংশ নয়। কলামের তালিকা আমি রাখা dataframe মধ্যে হয়, কিন্তু এটি ValueError উত্থাপন রাখে:cannot reindex from a duplicate axis
বোয়েন লিউ

@ বোয়েনলিউ যদি আপনার একই নামে একাধিক কলাম থাকে তবে এটি এই ত্রুটিটি দেখায়। এক্ষেত্রে আপনার নিজের পছন্দমতো কলামগুলি পাওয়ার জন্য আপনাকে আইলোক ব্যবহার করতে হবে বা লক করতে হবে, আমার মনে হয় আপনাকে গ্রুপবাইয়ের আগে এটি করতে হবে।
অ্যান্ডি হেডেন

40

aggফাংশন আপনার জন্য এই চেষ্টা করতে হবে। কলামগুলি পাস করুন এবং কলাম, আউটপুট সহ একটি ডিক হিসাবে ফাংশন:

df.groupby(['Country', 'Item_Code']).agg({'Y1961': np.sum, 'Y1962': [np.sum, np.mean]})  # Added example for two output columns from a single input column

এটি কেবলমাত্র কলামগুলি এবং নির্দিষ্ট করা সামগ্রিক কলাম দ্বারা গোষ্ঠী প্রদর্শন করবে। এই উদাহরণে আমি দুটি ওয়াই ফাংশন অন্তর্ভুক্ত করেছি যা 'ওয়াই 1962' এ প্রয়োগ হয়েছে।

আপনি যা দেখতে প্রত্যাশা করেছিলেন ঠিক তা পেতে, গ্রুপে অন্যান্য কলামগুলি এর দ্বারা অন্তর্ভুক্ত করে ফ্রেমের ওয়াই ভেরিয়েবলগুলিতে অঙ্কগুলি প্রয়োগ করুন:

df.groupby(['Code', 'Country', 'Item_Code', 'Item', 'Ele_Code', 'Unit']).agg({'Y1961': np.sum, 'Y1962': np.sum, 'Y1963': np.sum})

4
ধন্যবাদ, এটাকে কি জেনারালাইজ করা যায়? আমার কাছে Y1961 ফর্মটির প্রচুর কলাম রয়েছে ... তাই আমি এর মতো একটি তালিকা তৈরি করেছি: yrs = ['Y' + str (x) এক্স রেঞ্জের জন্য (1961, 2010 + 1, 1)]। আপনার সমাধান 'yrs' ভিতরে আগ্রাসন ব্যবহার করতে পারেন?
ব্যবহারকারী 308827

আমি আসলেই এই ধারণাটি পছন্দ করেছি। কৌতুকটি এই ডিকটি নির্মান করছে যার মানটি নিমপী সমষ্টি ফাংশন। বিপরীতে যদিও, আপনি যা করতে চান তা যদি সমস্ত কলামের সমষ্টি হয় তবে কলাম অনুসারে সমস্ত গ্রুপকে বিবৃতি অনুসারে গ্রুপে অন্তর্ভুক্ত করা হলে আপনার আসল-ইশ সমাধানটি কাজ করবে।
leroyJr

11

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

columns = ['Y'+str(i) for year in range(1967, 2011)]

df.groupby('Country')[columns].agg('sum')
আমাদের সাইট ব্যবহার করে, আপনি স্বীকার করেছেন যে আপনি আমাদের কুকি নীতি এবং গোপনীয়তা নীতিটি পড়েছেন এবং বুঝতে পেরেছেন ।
Licensed under cc by-sa 3.0 with attribution required.