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

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

DataFrame:

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

字符串
代码:

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


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

sqxo8psd

sqxo8psd1#

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

j8yoct9x2#

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

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

字符串

cig3rfwq

cig3rfwq3#

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

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

字符串

mfuanj7w

mfuanj7w4#

遍历groupby对象

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

import pandas as pd
from IPython.display import display

df = pd.DataFrame({
    'A': ['g1', 'g1', 'g2', 'g1'],
    'B': [1, 2, 3, 4],
    'C': ['a', 'b', 'c', 'd']
})

grouped = df.groupby('A')

list(grouped)         # OK
dict(iter(grouped))   # OK

for x in grouped:
    print(f"    Type of x: {type(x).__name__}\n  Length of x: {len(x)}")
    print(f"Value of x[0]: {x[0]}\n Type of x[1]: {type(x[1]).__name__}")
    display(x[1])

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

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

循环遍历分组的嵌套框架

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

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

相关问题