2012-04-29 16 views
231

करने के लिए एक पांडा GroupBy वस्तु परिवर्तित मैं इसDataFrame

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 

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

उत्तर

301

g1 यहां डेटाफ्रेम है। इसमें एक पदानुक्रमित सूचकांक है, हालांकि:

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 
+6

महान जवाब dataframe को मात्रा बुद्धिमान डेटा और दुकान के साथ समग्र है। एक दूसरा "गिनती" कॉलम के साथ दिखाया गया दूसरा मामला * बिल्कुल * जो मुझे चाहिए था। – saveenr

+6

'reset.index()' नौकरी करता है, बढ़िया! – gented

+16

आप इस्तेमाल कर सकते थे: 'df1.groupby ([" नाम "," शहर "]) .size()। To_frame (name = 'count')। Reset_index()' –

65

मैं वेस से थोड़ा सा परिवर्तन जवाब करना चाहते हैं, क्योंकि संस्करण 0.16.2 जरूरत as_index=False निर्धारित किया है। यदि आप इसे सेट नहीं करते हैं, तो आपको खाली डेटाफ्रेम मिलता है।

Source:

एकत्रीकरण कार्यों समूहों है कि तुम पर एकत्रित कर रहे हैं अगर वे कॉलम, जब as_index=True, डिफ़ॉल्ट नाम हैं नहीं लौटेगा। समूहबद्ध कॉलम लौटे ऑब्जेक्ट के सूचकांक होंगे।

पासिंग as_index=False उन समूहों को वापस कर देगा जिन्हें आप एकत्र कर रहे हैं, अगर उन्हें कॉलम नाम दिया गया है। mean, sum, size, count, std, var, sem, describe, first, last, nth, min, max:

को समेकित करना कार्यों जो कि वापस आ वस्तुओं के आयाम को कम करने, उदाहरण के लिए कर रहे हैं। यह तब होता है जब आप उदाहरण के लिए DataFrame.sum() करते हैं और Series वापस प्राप्त करते हैं।

एनएच रेड्यूसर या फ़िल्टर के रूप में कार्य कर सकता है, here देखें।

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 में और बाद में आप size में पैरामीटर name साथ count में subset और reset_index उपयोग कर सकते हैं:

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 मानों की गणना करता हैनहीं है।

+6

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

+0

क्या कोई कारण है कि 'as_index = गलत' नवीनतम संस्करणों में काम करना बंद कर दिया है? मैंने 'df1.groupby ([" नाम "," शहर "], as_index = झूठा) .size()' चलाने की भी कोशिश की लेकिन यह परिणाम को प्रभावित नहीं करता है (संभवतः क्योंकि समूह का परिणाम 'श्रृंखला' नहीं है डेटाफ्रेम ' –

+1

मुझे यकीन नहीं है, लेकिन ऐसा लगता है कि इन कॉलमों द्वारा केवल 2 कॉलम और 'groupby' हैं। लेकिन मुझे यकीन नहीं है, क्योंकि मैं पांडा डेवलपर नहीं हूं। – jezrael

4

मैंने पाया कि यह मेरे लिए काम करता है।

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

सीधे शब्दों में, यह कार्य करना चाहिए:

import pandas as pd 

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

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

यहाँ, grouped_df.size() अद्वितीय GroupBy गिनती को खींचती है, और reset_index() विधि स्तंभ आप इसे चाहते हैं उसका नाम रीसेट करता है होने के लिए। अंत में, डेटाफ्रेम ऑब्जेक्ट बनाने के लिए पांडा डेटाफ्रेम() फ़ंक्शन को कॉल किया जाता है।

+0

.to_frame() विधि देखें: grouped_df.size() .to_frame ('GROUP_COUNT') – Sealander

3

शायद मैं सवाल को गलत समझ सकता हूं लेकिन यदि आप समूह को वापस डेटाफ्रेम में कनवर्ट करना चाहते हैं तो आप .to_frame() का उपयोग कर सकते हैं। जब मैं ऐसा करता था तो मैं इंडेक्स को रीसेट करना चाहता था इसलिए मैंने उस भाग को भी शामिल किया।

उदाहरण कोड असंबंधित सवाल करने के लिए

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

मैं

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

 संबंधित मुद्दे

  • कोई संबंधित समस्या नहीं^_^