데이터 프레임 :
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]