python 如何在分组的Pandas框架上循环?

4xrmg8kj  于 2023-11-15  发布在  Python
关注(0)|答案(4)|浏览(211)

DataFrame:

  1. c_os_family_ss c_os_major_is l_customer_id_i
  2. 0 Windows 7 90418
  3. 1 Windows 7 90418
  4. 2 Windows 7 90418

字符串
代码:

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


我试图遍历聚合数据,但我得到了错误:

  1. ValueError: too many values to unpack


我希望循环访问每个组。如何操作?

sqxo8psd

sqxo8psd1#

df.groupby('l_customer_id_i').agg(lambda x: ','.join(x))已经返回了一个数组,所以你不能再循环这些组了。
一般而言:

  • df.groupby(...)返回一个GroupBy对象(DataFrameGroupBy或SeriesGroupBy),通过这个,你可以遍历组(如这里的文档中所解释的)。你可以这样做:
  1. grouped = df.groupby('A')
  2. for name, group in grouped:
  3. ...

字符串

  • 在groupby上应用函数时,在示例df.groupby(...).agg(...)中,(但也可以是transformapplymean、.),你合并应用函数到不同组的结果合并到一个嵌套框架中(groupby的“split-apply-合并”范例的apply和合并步骤)。因此,此操作的结果将始终是DataFrame(或Series,具体取决于所应用的函数)。
j8yoct9x

j8yoct9x2#

下面是一个迭代pd.DataFrame的例子,该pd.DataFrame被列atable分组。对于这个例子,在for循环中生成了SQL数据库的“create”语句:

  1. import pandas as pd
  2. df1 = pd.DataFrame({
  3. 'atable': ['Users', 'Users', 'Domains', 'Domains', 'Locks'],
  4. 'column': ['col_1', 'col_2', 'col_a', 'col_b', 'col'],
  5. 'column_type':['varchar', 'varchar', 'int', 'varchar', 'varchar'],
  6. 'is_null': ['No', 'No', 'Yes', 'No', 'Yes'],
  7. })
  8. df1_grouped = df1.groupby('atable')
  9. # iterate over each group
  10. for group_name, df_group in df1_grouped:
  11. print('\nCREATE TABLE {}('.format(group_name))
  12. for row_index, row in df_group.iterrows():
  13. col = row['column']
  14. column_type = row['column_type']
  15. is_null = 'NOT NULL' if row['is_null'] == 'No' else ''
  16. print('\t{} {} {},'.format(col, column_type, is_null))
  17. print(");")

字符串

展开查看全部
cig3rfwq

cig3rfwq3#

如果已经创建了索引框架,则可以覆盖索引值。

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

字符串

mfuanj7w

mfuanj7w4#

遍历groupby对象

当你通过DataFrame/Series分组时,你创建了一个pandas.core.groupby.generic.DataFrameGroupBy对象,它定义了__iter__()方法,所以可以像定义这个方法的任何其他对象一样迭代。它可以被转换成列表/元组/迭代器等。在每次迭代中,它返回一个元组,其第一个元素是分组器键,第二个元素是分组创建的一个数组;你可以把它想象成在dict_items上的迭代,在每次迭代中,项目都是键值元组。除非你在groupby对象上选择一个或多个列,否则它会返回所有的列。下面的代码的输出说明了这一点。

  1. import pandas as pd
  2. from IPython.display import display
  3. df = pd.DataFrame({
  4. 'A': ['g1', 'g1', 'g2', 'g1'],
  5. 'B': [1, 2, 3, 4],
  6. 'C': ['a', 'b', 'c', 'd']
  7. })
  8. grouped = df.groupby('A')
  9. list(grouped) # OK
  10. dict(iter(grouped)) # OK
  11. for x in grouped:
  12. print(f" Type of x: {type(x).__name__}\n Length of x: {len(x)}")
  13. print(f"Value of x[0]: {x[0]}\n Type of x[1]: {type(x[1]).__name__}")
  14. display(x[1])

字符串
x1c 0d1x的数据
在groupby对象上循环的一个非常有用的用例是将一个框架分割成单独的文件。例如,下面的代码从一个框架创建了两个csv文件(g_0.csv和g_1.csv)。

  1. for i, (k, g) in enumerate(df.groupby('A')):
  2. g.to_csv(f"g_{i}.csv")

循环遍历分组的嵌套框架

如上所述,groupby对象通过一个键将一个嵌套框分割成多个嵌套框。因此,您可以像对任何其他嵌套框一样对每个分组的嵌套框进行循环。有关对嵌套框进行循环的全面方法,请参阅this answer。最高效的方法可能是itertuples()。下面是一个使用分组的嵌套框上的循环创建嵌套字典的示例:

  1. out = {}
  2. for k, g in grouped: # loop over groupby
  3. out[k] = {}
  4. for row in g.itertuples(): # loop over dataframe
  5. out[k][row.B] = row.C
  6. print(out)
  7. # {'g1': {1: 'a', 2: 'b', 4: 'd'}, 'g2': {3: 'c'}}

展开查看全部

相关问题