랭귀지/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)