पंडों GroupBy उत्पादन श्रृंखला से DataFrame में परिवर्तित करना


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

लेकिन जो मैं चाहता हूं वह अंततः एक अन्य DataFrame ऑब्जेक्ट है जिसमें GroupBy ऑब्जेक्ट में सभी पंक्तियाँ हैं। दूसरे शब्दों में, मैं निम्नलिखित परिणाम प्राप्त करना चाहता हूं:

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

मैं पंडों के प्रलेखन में इसे पूरा करने का तरीका नहीं देख सकता। किसी भी संकेत का स्वागत किया जाएगा।


1
एक तरफ सवाल: आप किस पांडा संस्करण का उपयोग करते हैं? अगर पहले 2 कमांड निष्पादित करें तो मुझे g1 मिलता हैEmpty DataFrame Columns: [] Index: [(Alice, Seattle), (Bob, Seattle), (Mallory, Portland), (Mallory, Seattle)]
टिमोफे

1
प्रश्न का शीर्षक स्वीकृत उत्तर के संबंध में भ्रामक है
20

@matanster मैं पूछ सकता हूं कि आप यहां क्या जवाब जानने के लिए आए थे? हम एक अधिक सटीक उत्तर लिखने और सवाल के तहत एक टिप्पणी के साथ उपयोगकर्ताओं का ध्यान निर्देशित करने के बारे में सोच सकते हैं।
cs95

@coldspeed यह एसओ के साथ सिर्फ एक विशिष्ट मुद्दा है, प्रश्न शीर्षक को प्रश्न और उत्तर की सामग्री से महत्वपूर्ण रूप से अलग करने की अनुमति है। यदि मेटा शत्रुतापूर्ण नहीं था, तो संभवतः वहाँ एक उपयोगी पहलू होगा।
Matanster

@matanster मैं सहमत हूँ, हालाँकि मैं केवल यह जानने के लिए उत्सुक था कि यह आप क्या है जो वास्तव में उत्तर की खोज कर रहे थे, जैसे कि यह आपको यहाँ तक ले गया।
सीएस 95 पी

जवाबों:


529

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()काम करता है, महान!
14

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 में भी यह सच है? मैं एक groupby फंक्शन पा रहा हूँ जो pandas.core.groupby.DataFrameGroupByऑब्जेक्ट को लौटा रहा है, नहीं pandas.core.frame.DataFrame
एड्रियन कीस्टर

3
यह उत्तर नवीनतम अजगर और पांडा के लिए अप्रासंगिक लगता है
०१ पर matanster

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

nth एक reducer या एक फिल्टर के रूप में कार्य कर सकता है, यहां देखें ।

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पैरामीटर के साथ nameमें size:

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मायने रखता है NaN को महत्व देता है, जबकि countऐसा नहीं करता।


8
मुझे लगता है कि यह सबसे आसान तरीका है - एक लाइनर जो अच्छे तथ्य का उपयोग करता है जिसे आप रीसेट कॉलम के साथ श्रृंखला कॉलम का नाम दे सकते हैं:df1.groupby( [ "Name", "City"]).size().reset_index(name="count")
Ben

1
क्या ऐसा कोई कारण है कि as_index=False' stopped working in latest versions? I also tried to run df1.groupby (["नाम", "शहर"], as_index. False) .साइज़ () `लेकिन यह परिणाम को प्रभावित नहीं करता है (शायद क्योंकि समूहन का परिणाम 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 ( 'GROUP_COUNT')
Sealander

11

कुंजी को reset_index () विधि का उपयोग करना है ।

उपयोग:

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()

अब आपके पास 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()

6

नीचे समाधान सरल हो सकता है:

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

4

मैंने Qty वार डेटा और डेटाफ़्रेम के साथ स्टोर किया है

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

3

ये समाधान केवल आंशिक रूप से मेरे लिए काम करते थे क्योंकि मैं कई एकत्रीकरण कर रहा था। यहाँ मेरे द्वारा समूहीकृत का एक नमूना आउटपुट है जिसे मैं डेटाफ़्रेम में बदलना चाहता था:

ग्रुपबी आउटपुट

क्योंकि मैं reset_index () द्वारा प्रदान की गई गणना से अधिक चाहता था, इसलिए मैंने ऊपर की छवि को डेटाफ़्रेम में परिवर्तित करने के लिए एक मैन्युअल विधि लिखी। मैं समझता हूं कि यह ऐसा करने का सबसे पैथोनिक / पांडा तरीका नहीं है क्योंकि यह काफी क्रियात्मक और स्पष्ट है, लेकिन मुझे इसकी आवश्यकता थी। मूल रूप से, "स्कैफोल्डिंग" डेटाफ्रेम शुरू करने के लिए ऊपर बताए गए reset_index () विधि का उपयोग करें, फिर समूहबद्ध डेटाफ्रेम में समूह युग्मों के माध्यम से लूप करें, सूचकांकों को पुनः प्राप्त करें, अनियंत्रित डेटाफ़्रेम के विरुद्ध अपनी गणना करें और अपने नए एकत्रित डेटाफ़्रेम में मान सेट करें। ।

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()

क्या आप अपने समाधान के लिए उपयोग किए गए डेटासेट को साझा कर सकते हैं? आपका बहुत बहुत धन्यवाद!
जेफजेंग फेंग
हमारी साइट का प्रयोग करके, आप स्वीकार करते हैं कि आपने हमारी Cookie Policy और निजता नीति को पढ़ और समझा लिया है।
Licensed under cc by-sa 3.0 with attribution required.