【问题标题】:How to loop over grouped Pandas dataframe?如何循环分组的 Pandas 数据框?
【发布时间】:2015-02-08 21:52:51
【问题描述】:

数据帧:

  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           ,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,...

输出不是问题,我希望循环遍历每个组。

【问题讨论】:

    标签: python pandas dataframe iteration pandas-groupby


    【解决方案1】:

    下面是一个迭代 pd.DataFrame 的示例,该 pd.DataFrame 按列 atable 分组。对于此示例,在 for 循环中生成 SQL 数据库的“创建”语句:

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

    【讨论】:

    【解决方案2】:

    如果您的数据框已经创建,您可以迭代索引值。

    df = df.groupby('l_customer_id_i').agg(lambda x: ','.join(x))
    for name in df.index:
        print name
        print df.loc[name]
    

    【讨论】:

      【解决方案3】:

      df.groupby('l_customer_id_i').agg(lambda x: ','.join(x)) 确实已经返回了一个数据帧,所以你不能再循环遍历这些组了。

      一般:

      • df.groupby(...) 返回一个 GroupBy 对象(一个 DataFrameGroupBy 或 SeriesGroupBy),通过它,您可以遍历组(如文档 here 中所述)。您可以执行以下操作:

        grouped = df.groupby('A')
        
        for name, group in grouped:
            ...
        
      • 1234563 /strong> 将函数应用到一个数据框中的不同组的结果(groupby 的“split-apply-combine”范例的应用和组合步骤)。因此,其结果将始终是 DataFrame(或 Series 取决于应用的函数)。

      【讨论】:

        猜你喜欢
        • 1970-01-01
        • 1970-01-01
        • 2016-04-25
        • 2018-01-29
        • 2021-07-13
        • 1970-01-01
        • 1970-01-01
        • 2019-11-27
        • 1970-01-01
        相关资源
        最近更新 更多