সিরিজ থেকে ডেটা ফ্রেমে একটি পান্ডাস গ্রুপপুট আউটপুট রূপান্তর করা


494

আমি এভাবে ইনপুট ডেটা দিয়ে শুরু করছি

df1 = pandas.DataFrame( { 
    "Name" : ["Alice", "Bob", "Mallory", "Mallory", "Bob" , "Mallory"] , 
    "City" : ["Seattle", "Seattle", "Portland", "Seattle", "Seattle", "Portland"] } )

মুদ্রিত হওয়ার পরে যা প্রদর্শিত হয়:

   City     Name
0   Seattle    Alice
1   Seattle      Bob
2  Portland  Mallory
3   Seattle  Mallory
4   Seattle      Bob
5  Portland  Mallory

গ্রুপিং যথেষ্ট সহজ:

g1 = df1.groupby( [ "Name", "City"] ).count()

এবং মুদ্রণের ফলে একটি GroupByবস্তু পাওয়া যায়:

                  City  Name
Name    City
Alice   Seattle      1     1
Bob     Seattle      2     2
Mallory Portland     2     2
        Seattle      1     1

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

                  City  Name
Name    City
Alice   Seattle      1     1
Bob     Seattle      2     2
Mallory Portland     2     2
Mallory Seattle      1     1

পান্ডাস ডকুমেন্টেশনে এটি কীভাবে সম্পন্ন করা যায় তা আমি বেশ দেখতে পাচ্ছি না। যে কোনও ইঙ্গিত স্বাগত জানানো হবে।


1
পাশাপাশি প্রশ্ন: আপনি কোন পান্ডসের সংস্করণ ব্যবহার করেন? যদি প্রথম 2 টি কমান্ড কার্যকর করে আমি জি 1 পাইEmpty DataFrame Columns: [] Index: [(Alice, Seattle), (Bob, Seattle), (Mallory, Portland), (Mallory, Seattle)]
টিমোফায়

1
প্রশ্নের শিরোনাম গ্রহণযোগ্য উত্তর সম্পর্কিত বিভ্রান্ত করছে
ম্যাট্যানস্টার

@ ম্যান্টাস্টার আমি জিজ্ঞাসা করতে পারি আপনি এখানে উত্তরটি খুঁজতে কী এসেছেন? আমরা আরও সঠিক উত্তর লিখতে এবং প্রশ্নের অধীনে একটি মন্তব্যে ব্যবহারকারীদের দৃষ্টি আকর্ষণ করার বিষয়ে ভাবতে পারি।
cs95

@ কোল্ডস্পিড এটি কেবলমাত্র একটি সাধারণ সমস্যা, তাই প্রশ্নের শিরোনামগুলিতে প্রশ্ন এবং উত্তরগুলির বিষয়বস্তু থেকে উল্লেখযোগ্যভাবে সরিয়ে দেওয়া উচিত। যদি মেটা এতটা বৈরী না হয়ে থাকে যে সম্ভবত সেখানে উত্থাপন করার জন্য এটি একটি কার্যকর দিক হতে পারে।
ম্যাটানস্টার

@ ম্যান্টাস্টার আমি সম্মত, তবে আপনি কেবল উত্তরটি অনুসন্ধান করছেন এমনটি জানার জন্য কেবল আগ্রহী ছিলাম, যেমন এটি আপনাকে এখানে নিয়ে গেছে।
সিএস 95

উত্তর:


528

g1এখানে হয় একটি DataFrame। যদিও এটির একটি শ্রেণিবিন্যাস সূচক রয়েছে:

In [19]: type(g1)
Out[19]: pandas.core.frame.DataFrame

In [20]: g1.index
Out[20]: 
MultiIndex([('Alice', 'Seattle'), ('Bob', 'Seattle'), ('Mallory', 'Portland'),
       ('Mallory', 'Seattle')], dtype=object)

সম্ভবত আপনি এই কিছু চান?

In [21]: g1.add_suffix('_Count').reset_index()
Out[21]: 
      Name      City  City_Count  Name_Count
0    Alice   Seattle           1           1
1      Bob   Seattle           2           2
2  Mallory  Portland           2           2
3  Mallory   Seattle           1           1

বা এর মতো কিছু:

In [36]: DataFrame({'count' : df1.groupby( [ "Name", "City"] ).size()}).reset_index()
Out[36]: 
      Name      City  count
0    Alice   Seattle      1
1      Bob   Seattle      2
2  Mallory  Portland      2
3  Mallory   Seattle      1

26
reset.index()কাজ করে, দুর্দান্ত!

54
আপনি ব্যবহার করতে পারেন:df1.groupby( [ "Name", "City"] ).size().to_frame(name = 'count').reset_index()
নেহাল জে ওনি

3
দ্বিতীয় উদাহরণটি ব্যবহারটি .reset_index()আমার কাছে মনে হচ্ছে আপনি যে আউটপুটটি পাবেন তা যোগ দেওয়ার সেরা উপায় df.groupby('some_column').apply(your_custom_func)। এটি আমার পক্ষে স্বজ্ঞাত ছিল না।
আলেকজান্ডার

5
পাইথন 3 এও কি সত্য? আমি pandas.core.groupby.DataFrameGroupByবস্তুটি ফিরিয়ে দেওয়ার মতো একটি গ্রুপবাই ফাংশন খুঁজে পাচ্ছি , না pandas.core.frame.DataFrame
অ্যাড্রিয়ান কেইস্টার

3
এই উত্তরটি সর্বশেষ পাইথন এবং
পান্ডার

127

ওয়েস দ্বারা প্রদত্ত উত্তরটি আমি সামান্য পরিবর্তন করতে চাই কারণ 0.16.2 সংস্করণটির প্রয়োজন as_index=False। আপনি যদি সেট না করে থাকেন তবে আপনি একটি খালি ডেটাফ্রেম পাবেন।

সূত্র :

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

পাসিংগুলি as_index=Falseআপনি যে দলগুলিকে একত্রিত করছেন তাদেরকে কলামের নাম দেওয়া থাকলে তারা ফিরে আসবে।

সঞ্চিত ফাংশন বেশী যে ফিরে বস্তুর মাত্রা কমাতে, উদাহরণস্বরূপ করা হয়: mean, sum, size, count, std, var, sem, describe, first, last, nth, min, max। আপনি যখন উদাহরণস্বরূপ এটি করেন DataFrame.sum()এবং ফিরে আসেন তখন এটি ঘটে Series

n তম একটি হ্রাসকারী বা ফিল্টার হিসাবে কাজ করতে পারে, এখানে দেখুন

import pandas as pd

df1 = pd.DataFrame({"Name":["Alice", "Bob", "Mallory", "Mallory", "Bob" , "Mallory"],
                    "City":["Seattle","Seattle","Portland","Seattle","Seattle","Portland"]})
print df1
#
#       City     Name
#0   Seattle    Alice
#1   Seattle      Bob
#2  Portland  Mallory
#3   Seattle  Mallory
#4   Seattle      Bob
#5  Portland  Mallory
#
g1 = df1.groupby(["Name", "City"], as_index=False).count()
print g1
#
#                  City  Name
#Name    City
#Alice   Seattle      1     1
#Bob     Seattle      2     2
#Mallory Portland     2     2
#        Seattle      1     1
#

সম্পাদনা করুন:

সংস্করণে 0.17.1এবং পরে আপনি ব্যবহার করতে পারেন subsetমধ্যে countএবং reset_indexপরামিতি সঙ্গে namesize:

print df1.groupby(["Name", "City"], as_index=False ).count()
#IndexError: list index out of range

print df1.groupby(["Name", "City"]).count()
#Empty DataFrame
#Columns: []
#Index: [(Alice, Seattle), (Bob, Seattle), (Mallory, Portland), (Mallory, Seattle)]

print df1.groupby(["Name", "City"])[['Name','City']].count()
#                  Name  City
#Name    City                
#Alice   Seattle      1     1
#Bob     Seattle      2     2
#Mallory Portland     2     2
#        Seattle      1     1

print df1.groupby(["Name", "City"]).size().reset_index(name='count')
#      Name      City  count
#0    Alice   Seattle      1
#1      Bob   Seattle      2
#2  Mallory  Portland      2
#3  Mallory   Seattle      1

countএবং এর মধ্যে পার্থক্য sizeহ'ল sizeনাএন মানগুলি গণনা countকরে does


8
আমি মনে করি এটি সবচেয়ে সহজতম উপায় - একটি লাইনার যা এই সত্যটি ব্যবহার করে যে আপনি সিরিজ কলামটির নাম রিসেট_ইন্ডেক্স সহ করতে পারবেন:df1.groupby( [ "Name", "City"]).size().reset_index(name="count")
বেন

1
as_index=False' stopped working in latest versions? I also tried to run Df1.groupby (["নাম", "শহর"], as_index = মিথ্যা) এর কোনও কারণ আছে কি? সাইজ () `তবে এটি ফলাফলকে প্রভাবিত করে না (সম্ভবত গ্রুপিংয়ের ফলাফলটি Seriesনয়DataFrame
রোমান পেকার

1
আমি নিশ্চিত নই, তবে মনে হচ্ছে কেবল 2 টি কলাম রয়েছে এবং groupbyএই কলামগুলি দ্বারা। তবে আমি নিশ্চিত নই, কারণ আমি পান্ডাস বিকাশকারী নই।
jezrael

20

সহজভাবে, এই কাজটি করা উচিত:

import pandas as pd

grouped_df = df1.groupby( [ "Name", "City"] )

pd.DataFrame(grouped_df.size().reset_index(name = "Group_Count"))

এখানে, grouped_df.size()অনন্য গ্রুপবাইয়ের গণনাটি টানছে এবং reset_index()পদ্ধতিটি আপনি যে কলামটি এটি চান সেটির নাম পুনরায় সেট করে। শেষ পর্যন্ত, Dataframe()পান্ডাস ফাংশনটি ডেটা ফ্রেম অবজেক্ট তৈরি করার জন্য আহ্বান জানানো হয়।


2
.To_frame () পদ্ধতিটি দেখুন: grouped_df.size ()। To_frame ('গ্রুপ_কাউন্ট')
সিল্যান্ডার

11

কীটি হ'ল রিসেট_ইন্ডেক্স () পদ্ধতিটি ব্যবহার করা ।

ব্যবহার করুন:

import pandas

df1 = pandas.DataFrame( { 
    "Name" : ["Alice", "Bob", "Mallory", "Mallory", "Bob" , "Mallory"] , 
    "City" : ["Seattle", "Seattle", "Portland", "Seattle", "Seattle", "Portland"] } )

g1 = df1.groupby( [ "Name", "City"] ).count().reset_index()

এখন আপনি আপনার নতুন dataframe আছে G1 :

ফলাফল ডেটা ফ্রেম


9

হয়তো আমি প্রশ্নটি ভুল বুঝেছি তবে আপনি যদি গ্রুপবাইকে কোনও ডেটা ফ্রেমে রূপান্তর করতে চান তবে আপনি .to_frame () ব্যবহার করতে পারেন। আমি সূচিটি পুনরায় সেট করতে চেয়েছিলাম যখন আমি এটি করেছি তাই আমি সেই অংশটিও অন্তর্ভুক্ত করেছি।

উদাহরণ কোড প্রশ্নের সাথে সম্পর্কিত নয়

df = df['TIME'].groupby(df['Name']).min()
df = df.to_frame()
df = df.reset_index(level=['Name',"TIME"])

6

আমি এটি আমার জন্য কাজ পেয়েছি।

import numpy as np
import pandas as pd

df1 = pd.DataFrame({ 
    "Name" : ["Alice", "Bob", "Mallory", "Mallory", "Bob" , "Mallory"] , 
    "City" : ["Seattle", "Seattle", "Portland", "Seattle", "Seattle", "Portland"]})

df1['City_count'] = 1
df1['Name_count'] = 1

df1.groupby(['Name', 'City'], as_index=False).count()


4

আমি কিউটি বুদ্ধিমান ডেটা এবং ডেটাফ্রেমে স্টোর সঞ্চয় করেছি

almo_grp_data = pd.DataFrame({'Qty_cnt' :
almo_slt_models_data.groupby( ['orderDate','Item','State Abv']
          )['Qty'].sum()}).reset_index()

3

এই সমাধানগুলি কেবলমাত্র আমার জন্য কাজ করেছিল কারণ আমি একাধিক সংঘবদ্ধতা করছি। এখানে আমার গোছানো একটি নমুনা আউটপুট যা আমি একটি ডেটা ফ্রেমে রূপান্তর করতে চেয়েছিলাম:

গ্রুপপাই আউটপুট

আমি রিসেট_ইন্ডেক্স () দ্বারা সরবরাহিত গণনার চেয়ে বেশি চেয়েছি, তাই উপরের চিত্রটি ডেটাফ্রেমে রূপান্তর করার জন্য আমি একটি ম্যানুয়াল পদ্ধতি লিখেছিলাম। আমি বুঝতে পেরেছি যে এটি বেশ ভার্চুয়াল এবং স্পষ্টরূপে এটি করার সবচেয়ে প্যাথোনিক / পান্ডাস উপায় নয়, তবে এটি আমার প্রয়োজন ছিল। মূলত, "স্ক্যাফল্ডিং" ডেটাফ্রেম শুরু করার জন্য উপরে বর্ণিত রিসেট_আইএনডেক্স () পদ্ধতিটি ব্যবহার করুন, তারপরে গোষ্ঠীযুক্ত ডেটাফ্রেমে গ্রুপ জুটিগুলি লুপ করুন, সূচকগুলি পুনরুদ্ধার করুন, দলবদ্ধ না হওয়া ডেটাফ্রেমের বিরুদ্ধে আপনার গণনা সম্পাদন করুন এবং আপনার নতুন একত্রিত ডেটাফ্রেমের মান নির্ধারণ করুন ।

df_grouped = df[['Salary Basis', 'Job Title', 'Hourly Rate', 'Male Count', 'Female Count']]
df_grouped = df_grouped.groupby(['Salary Basis', 'Job Title'], as_index=False)

# Grouped gives us the indices we want for each grouping
# We cannot convert a groupedby object back to a dataframe, so we need to do it manually
# Create a new dataframe to work against
df_aggregated = df_grouped.size().to_frame('Total Count').reset_index()
df_aggregated['Male Count'] = 0
df_aggregated['Female Count'] = 0
df_aggregated['Job Rate'] = 0

def manualAggregations(indices_array):
    temp_df = df.iloc[indices_array]
    return {
        'Male Count': temp_df['Male Count'].sum(),
        'Female Count': temp_df['Female Count'].sum(),
        'Job Rate': temp_df['Hourly Rate'].max()
    }

for name, group in df_grouped:
    ix = df_grouped.indices[name]
    calcDict = manualAggregations(ix)

    for key in calcDict:
        #Salary Basis, Job Title
        columns = list(name)
        df_aggregated.loc[(df_aggregated['Salary Basis'] == columns[0]) & 
                          (df_aggregated['Job Title'] == columns[1]), key] = calcDict[key]

যদি কোনও অভিধান আপনার জিনিস না হয় তবে গণনাগুলি লুপের জন্য ইনলাইন প্রয়োগ করা যেতে পারে:

    df_aggregated['Male Count'].loc[(df_aggregated['Salary Basis'] == columns[0]) & 
                                (df_aggregated['Job Title'] == columns[1])] = df['Male Count'].iloc[ix].sum()

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