[python] 그룹화 된 팬더 데이터 프레임을 반복하는 방법?

데이터 프레임 :

  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, …), 당신은 결합 의 결과 적용 함께 한 dataframe에서 다른 그룹에 기능을합니다 (적용하고 단계를 결합 ‘분할 적용 조합’패러다임). 따라서이 결과는 항상 다시 DataFrame (또는 적용된 함수에 따라 Series)이됩니다.


답변

다음은 pd.DataFrame열별로 그룹화 된 반복 예제입니다 atable. 샘플 사용 사례의 경우 SQL 데이터베이스에 대한 “create”문이 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(");")


답변

데이터 프레임이 이미 생성 된 경우 인덱스 값을 반복 할 수 있습니다.

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


답변