如何循环分组的 Pandas 数据框?

新手上路,请多包涵

数据框:

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

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

原文由 Tjorriemorrie 发布,翻译遵循 CC BY-SA 4.0 许可协议

阅读 763
2 个回答

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

  • When you apply a function on the groupby, in your example df.groupby(...).agg(...) (but this can also be transform , apply , mean , . ..),您 函数 应用于 不同组的结果组合在一个数据框中(groupby 的“拆分-应用-组合”范例的应用和组合步骤)。因此,其结果将始终是一个 DataFrame(或一个 Series,具体取决于所应用的函数)。

原文由 joris 发布,翻译遵循 CC BY-SA 3.0 许可协议

下面是一个迭代 pd.DataFrame 列的 atable 。对于此示例,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(");")

原文由 Andrei Sura 发布,翻译遵循 CC BY-SA 4.0 许可协议

撰写回答
你尚未登录,登录后可以
  • 和开发者交流问题的细节
  • 关注并接收问题和回答的更新提醒
  • 参与内容的编辑和改进,让解决方法与时俱进
推荐问题