[英]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(...)
(但這也可以是transform
, apply
, mean
,...),您結合應用的結果將不同組的功能放在一個數據框中(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.