簡體   English   中英

如何循環分組的 Pandas 數據框?

[英]How to loop over grouped Pandas 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

代碼:

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

輸出不是問題,我希望遍歷每個組。

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-combine”范式的應用和組合步驟)。 因此,此結果將始終再次成為 DataFrame(或 Series 取決於應用的功能)。

這是一個迭代按列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(");")

如果您的數據框已經創建,您可以迭代索引值。

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

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM