如何循环分组Pandas数据帧?

2024-06-06 18:06:37 发布

您现在位置:Python中文网/ 问答频道 /正文

数据帧:

  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: too many values to unpack

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

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


Tags: 数据代码nameiddfisoswindows
3条回答

如果已经创建了数据帧,则可以迭代索引值。

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

下面是对按列atable分组的pd.DataFrame进行迭代的示例。对于一个示例用例,SQL数据库的“create”语句是在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(");")

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:
        ...
    
  • 当您在groupby上应用函数时,在您的示例df.groupby(...).agg(...)(但也可以是transformapplymean,…)中,您将该函数在一个数据帧中一起应用到不同组的结果(groupby的“split-apply-combine”范式的“apply”和“combine”步骤)。因此,结果将始终是一个数据帧(或一个序列,取决于应用的函数)。

相关问题 更多 >