아미(아름다운미소)

pandas sum,count,몫,나머지 구하기 본문

랭귀지/pandas

pandas sum,count,몫,나머지 구하기

유키공 2024. 8. 22. 20:12
import pandas as pd

# 예시 데이터프레임 생성
data = {
    'a': ['x', 'x', 'y', 'y', 'x', 'y', 'x', 'y', 'x', 'y'],
    'b': [1, 1, 2, 2, 1, 1, 2, 2, 1, 1],
    'c': ['foo', 'foo', 'bar', 'bar', 'foo', 'foo', 'bar', 'bar', 'foo', 'foo'],
    'd': [10, 10, 20, 20, 10, 10, 20, 20, 10, 10],
    'e': [4, 6, 10, 15, 25, 5, 3, 8, 12, 7],
    'f': ['A', 'B', 'C', 'D', 'E', 'F', 'G', 'H', 'I', 'J']
}

df = pd.DataFrame(data)

# 그룹화 후 e 컬럼의 합계와 행 수 계산
result = df.groupby(['a', 'b', 'c', 'd']).agg(
    total_sum=('e', 'sum'),
    row_count=('e', 'count')
).reset_index()

# 컬럼 이름 변경
result.rename(columns={'total_sum': 'total sum', 'row_count': 'row count'}, inplace=True)

# 몫과 나머지 계산
result['quotient'], result['remainder'] = divmod(result['total sum'], result['row count'])

# df와 result를 left outer join
merged_df = pd.merge(df, result, on=['a', 'b', 'c', 'd'], how='left')

merged_df['remainder_add'] = 0

# 각 그룹별로 d 컬럼 채우기
for name, group in merged_df.groupby(['a', 'b', 'c', 'd']):
    if not group.empty:  # 그룹이 비어있지 않은지 체크
        count = group['remainder'].iloc[0]  # 첫 번째 행의 c 값을 가져옴
        fill_count = min(count, len(group))  # c 값과 그룹 길이 중 작은 값
        merged_df.loc[group.index[:fill_count], 'remainder_add'] = 1  # c가 양수일 경우 1로 채움

merged_df['remainder_sum'] = merged_df['quotient'] + merged_df['remainder_add']
print(merged_df)
Comments