समूहीकृत पंडों के डेटाफ्रेम पर लूप कैसे करें?


146

डेटा ढांचा:

  c_os_family_ss c_os_major_is l_customer_id_i
0      Windows 7                         90418
1      Windows 7                         90418
2      Windows 7                         90418

कोड:

print df
for name, group in df.groupby('l_customer_id_i').agg(lambda x: ','.join(x)):
    print name
    print group

मैं एकत्रित डेटा पर सिर्फ लूप करने की कोशिश कर रहा हूं, लेकिन मुझे त्रुटि मिलती है:

ValueError: कई मानों को अनपैक करने के लिए

@EdChum, यहाँ अपेक्षित आउटपुट है:

                                                    c_os_family_ss  \
l_customer_id_i
131572           Windows 7,Windows 7,Windows 7,Windows 7,Window...
135467           Windows 7,Windows 7,Windows 7,Windows 7,Window...

                                                     c_os_major_is
l_customer_id_i
131572           ,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,...
135467           ,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,...

आउटपुट समस्या नहीं है, मैं हर समूह पर लूप करना चाहता हूं।

जवाबों:


224

df.groupby('l_customer_id_i').agg(lambda x: ','.join(x)) पहले से ही एक डेटाफ्रेम लौटाता है, इसलिए आप अब समूहों पर लूप नहीं कर सकते।

सामान्य रूप में:

  • df.groupby(...)एक GroupByऑब्जेक्ट (एक DataFrameGroupBy या SeriesGroupBy) देता है, और इसके साथ, आप समूहों के माध्यम से पुनरावृति कर सकते हैं (जैसा कि यहां डॉक्स में बताया गया है )। आप कुछ ऐसा कर सकते हैं:

    grouped = df.groupby('A')
    
    for name, group in grouped:
        ...
    
  • जब आप GroupBy, अपने उदाहरण में पर एक समारोह लागू df.groupby(...).agg(...)(लेकिन यह भी हो सकता है transform, apply, mean, ...), आप गठबंधन का नतीजा लागू करने के साथ एक dataframe में विभिन्न समूहों के लिए समारोह (लागू करते हैं और के कदम गठबंधन 'विभाजित-लागू-गठबंधन' समूह के प्रतिमान)। तो इसका परिणाम हमेशा एक DataFrame (या लागू फ़ंक्शन के आधार पर एक श्रृंखला) होगा।


50

यहाँ pd.DataFrameकॉलम द्वारा समूहीकृत पर पुनरावृति का एक उदाहरण है atable। एक नमूना usecase के लिए, SQL डेटाबेस के लिए "बनाएँ" स्टेटमेंट forलूप के भीतर उत्पन्न होते हैं :

import pandas as pd

df1 = pd.DataFrame({
    'atable':     ['Users', 'Users', 'Domains', 'Domains', 'Locks'],
    'column':     ['col_1', 'col_2', 'col_a', 'col_b', 'col'],
    'column_type':['varchar', 'varchar', 'int', 'varchar', 'varchar'],
    'is_null':    ['No', 'No', 'Yes', 'No', 'Yes'],
})

df1_grouped = df1.groupby('atable')

# iterate over each group
for group_name, df_group in df1_grouped:
    print('\nCREATE TABLE {}('.format(group_name))

    for row_index, row in df_group.iterrows():
        col = row['column']
        column_type = row['column_type']
        is_null = 'NOT NULL' if row['is_null'] == 'NO' else ''
        print('\t{} {} {},'.format(col, column_type, is_null))

    print(");")

8
प्रदर्शन है कि आप एक व्यक्ति के माध्यम से पुनरावृति कर सकते हैं के लिए धन्यवाद groupका उपयोग कर for row, data in group.iterrows()!
tatlar

16

यदि आपकी डेटाफ्रेम पहले ही बन चुकी है, तो आप सूचकांक मूल्यों पर पुनरावृत्ति कर सकते हैं।

df = df.groupby('l_customer_id_i').agg(lambda x: ','.join(x))
for name in df.index:
    print name
    print df.loc[name]
हमारी साइट का प्रयोग करके, आप स्वीकार करते हैं कि आपने हमारी Cookie Policy और निजता नीति को पढ़ और समझा लिया है।
Licensed under cc by-sa 3.0 with attribution required.