데이터 전처리 | Pandas 기본 함수 3 (concat,merge,groupby,pivot_table,sort_value)

2024. 12. 17. 18:45·PYTHON

☑️ 데이터프레임 연결하기 (concat , merge)

✔️`concat` :위 아래 /좌우로 테이블 연결하기 
        1. concat([테이블1,테이블2],axsis=0) : 위아래로 연결
        2. concat([테이블1,테이블2],axsis=1) : 좌우로 연결
✔️ `.merge` : sql의 join이랑 유사, key컬럼을 기준으로 테이블 연결하기 
        1. .merge(df1,df2, on='key', [how='inner']) 로 연결함
  • `concat` 은 행/열 수가 다를경우 null로 값이 저장됨 
# 데이터병합1 - concat

df1 = pd.DataFrame({'A': ['A0', 'A1', 'A2'], 'B': ['B0', 'B1', 'B2']})
df2 = pd.DataFrame({'A': ['A3', 'A4', 'A5'], 'B': ['B3', 'B4', 'B5']})

# 위아래로 데이터프레임 연결
result_vertical = pd.concat([df1, df2], axis=0) #axis =0 은 생략 =/디폴트 값 

# 병합시 인덱스 중구난방, 순서대로 정렬시 : reset.index(drop=True) 사용
pd.concat([df1, df2], axis=0).reset.index(drop=True) 

# 좌우로 데이터프레임 연결
result_horizontal = pd.concat([df1, df2], axis=1)

#위아래, 좌우로 연결시 행/열수가 다를 경우 null으로 합쳐짐
  • how 절 디폴트는 'inner' 
left_df = pd.DataFrame({'key': ['A', 'B', 'C', 'D'], 'value': [1, 2, 3, 4]})
right_df = pd.DataFrame({'key': ['B', 'D', 'E', 'F'], 'value': [5, 6, 7, 8]})

# 'key' 열을 기준으로 두 데이터프레임 병합

i_merged_df = pd.merge(left_df, right_df, on='key', how='inner') # df 간의 겹치는 데이터만
o_merged_df = pd.merge(left_df, right_df, on='key', how='outer') # 모든 데이터만 
l_merged_df = pd.merge(left_df, right_df, on='key', how='left') # left 전부 출력 
r_merged_df = pd.merge(left_df, right_df, on='key', how='right') # right 전부 출력 

print(l_merged_df)

☑️ 데이터 그룹핑& 집계하기 (GROUPBY)

  • 기본 문법 : `df.groupby(’기준 컬럼’).집계 메소드()`
  • 특정 컬럼 기준으로 특정 컬럼 집계 시
    • df.groupby('기준컬럼')['집계컬럼'].집계메소드()  → ex) sex컬럼 기준 tip의 평균 값 : df.groupby('sex')['tip'].mean()
data = {
    'Category': ['A', 'B', 'A', 'B', 'A', 'B'],
    'Value': [1, 2, 3, 4, 5, 6]
}
df = pd.DataFrame(data)

# 'Category' 열을 기준으로 그룹화하여 'Value'의 집계 수행
grouped = df.groupby('Category').mean() # 평균
grouped_sum = df.groupby('Category').sum()
grouped_count = df.groupby('Category').count()
grouped_max = df.groupby('Category').max()
grouped_min = df.groupby('Category').min()
grouped_first = df.groupby('Category').first() # 첫번째 등장하는 값 출력 
grouped_agg = df.groupby('Category').agg(list) # value 값들을 리스트로 모두 출력 

print(grouped_agg)
#그룹 기준 컬럼과 집계 컬럼이 다를때 
df.groupby(['day','time'])['total_bill'].sum() # day,time 기준으로 total_bill의 합계 

#1개 컬럼 기준으로 평균 값 
df[['day','total_bill','tip']].groupby('day').mean() # day 기준 평균 값 

#여러개 컬럼 기준 평균 : [] 리스트로 컬럼 감싸주고 
df[['day','total_bill','tip','sex']].groupby(['day','sex']).mean()  # day,sex 기준 평균 값 

#컬럼별로 집계를 다르게 하기 : .agg({'컬럼' : '메소드명','컬럼':'메소드명' }) 
df[['day','total_bill','tip','sex']].groupby(['day','sex']).agg({'total_bill': 'max','tip': 'sum'})

☑️ 피벗하기 (pivot_table)

  • 기본 문법 : `.pivot_table(index='컬럼',columns= '컬럼',values= '값',aggfunc='집계명')`
data = {
    'Date': ['2023-01-01', '2023-01-01', '2023-01-02', '2023-01-02', '2023-01-01'],
    'Category': ['A', 'B', 'A', 'B', 'A'],
    'Value': [10, 20, 30, 40, 50]
}
df = pd.DataFrame(data)

#1피벗 테이블 생성: 날짜를 행 인덱스로, 카테고리를 열 인덱스로, 값은 'Value'의 합으로 집계
pivot = df.pivot_table(index='Date', columns='Category', values='Value', aggfunc='sum')
print(pivot) #일자별 카테고리의 값의 합계 

#2여러개 컬럼 기준 피벗 하기 : [] 리스트로 묶어줌 
data = {
    'Date': ['2023-01-01', '2023-01-01', '2023-01-02', '2023-01-02', '2023-01-01'],
    'Category': ['A', 'B', 'A', 'B', 'A'],
    'SubCategory': ['X', 'Y', 'X', 'Y', 'X'],
    'Value': [10, 20, 30, 40, 50]
}
df = pd.DataFrame(data)
pivot = df.pivot_table(index='Date',columns=['Category','SubCategory'],values='Value',aggfunc='sum')
pivot 

#날짜 기준, 카테고리/서브카테고리의 값들의 합계 출력

☑️ 정렬하기 (.sort_value() / .sort_index())

  • 컬럼 기준 정렬
    • 오름차순 : .sort_values(by = '정렬기준 컬럼')
    • 내림차순 .sort_values(by = ‘정렬기준 컬럼’ , ascending =False )
  • 인덱스 기준 정렬
    • 오름차순 : df.sort_index() 
    • 내림차순 : df.sort_index(ascending=False) 
data = {
    'Name': ['Alice', 'Bob', 'Charlie', 'David', 'Eva'],
    'Age': [25, 22, 30, 18, 27],
    'Score': [85, 90, 75, 80, 95]
}
df = pd.DataFrame(data)

# 1개의 컬럼을 기준으로 
df.sort_values(by='Age') #오름차
df.sort_values(by='Age',ascending = False) #내림차

# 여러개 컬럼을 기준으로 다양하게 정렬 
df.sort_values(by=['Age','Score'],ascending = [True,False]) #age 오름차, score 내림차 정렬

# 인덱스로 정렬하기 : sort_index()
df.sort_index() # 인덱스를 기준으로 오름차순 정렬
df.sort_index(ascending=False) # 인덱스를 기준으로 내림차순 정렬

☑️ 판다스 실습 예제 

더보기
iris_data = sns.load_dataset('iris') # iris 데이터셋 로드하기
iris_data
df = pd.DataFrame(iris_data) # df 변수에 저장

# Q1. 'species' 열 값이 'setosa'인 데이터 선택하기
df[df['species'].isin(['setosa'])] #(정답) df[df['species']=='setosa']

# Q2. 10부터 20까지의 행과 1부터 3까지의 열 선택하기
df.iloc[10:21,1:4]

 

tips_data = sns.load_dataset('tips') # tips 데이터셋 로드하기
df = pd.DataFrame(tips_data) # df 변수에 저장

#-- 혼자 풀어보기 --
# Q1. total_bill이 30 이상인 데이터만 선택하기
df[df['total_bill']>=30]

# Q2. 성별('sex')을 기준으로 데이터 그룹화하여 팁(tip)의 평균 계산
df.groupby('sex').agg({'tip':'mean'})
#(정답) df.groupby('sex')['tip'].mean()

# Q3. 'day'와 'time'을 기준으로 데이터 그룹화하여 전체 지불 금액(total_bill)의 합 계산
df.groupby(['day','time']).agg({'total_bill': 'sum'})
#(정답) df.groupby(['day','time'])['total_bill'].sum()

# Q4. 'day' 열을 기준으로 각 요일별로 팁(tip)의 평균을 새로운 데이터프레임으로 만든 후, 이를 기존의 **`tips`** 데이터셋에 합쳐보자

# 그룹바이 테이블 생성
avg_df = df.groupby('day').agg({'tip':'mean'})
#(정답) right_df = df.groupby('day')['tip'].mean()

#중복명 변경
avg_df = avg_df.rename(columns={'tip':'avg_tip'}) # tip 이름 변경
#(정답)avg_df.columns = ['avg_tip']

#left merge
left_merged_df = pd.merge(df,avg_df,on='day',how='left') #동일한 요일일때 병합
left_merged_df

'PYTHON' 카테고리의 다른 글

데이터 전처리 실습 | Pandas 결측치 / 중복값 / 이상치 처리/minmax 정규화  (0) 2024.12.18
코테 준비 | 프로그래머스 하샤드 수 / 두 정수 사이의 합 (리스트 컴프리헨션 & range)  (0) 2024.12.18
데이터 전처리| Pandas 기본 함수2 (loc, iloc,isin)  (0) 2024.12.17
데이터 전처리 | Pandas 기본 함수 1  (2) 2024.12.17
코테 준비 | 프로그래머스 정수 내림차순으로 배치하기/정수 제곱근 판별 (Sorted/Join/Range)  (0) 2024.12.17
'PYTHON' 카테고리의 다른 글
  • 데이터 전처리 실습 | Pandas 결측치 / 중복값 / 이상치 처리/minmax 정규화
  • 코테 준비 | 프로그래머스 하샤드 수 / 두 정수 사이의 합 (리스트 컴프리헨션 & range)
  • 데이터 전처리| Pandas 기본 함수2 (loc, iloc,isin)
  • 데이터 전처리 | Pandas 기본 함수 1
성장하는 쿠키의 로그 기록
성장하는 쿠키의 로그 기록
성장하는 쿠키의 모든 로그를 담습니다.
  • 성장하는 쿠키의 로그 기록
    쿠키 로그
    성장하는 쿠키의 로그 기록
  • 전체
    오늘
    어제
    • 분류 전체보기 (143) N
      • TODAY I LEARNED (2) N
      • 데이터 분석 (13)
      • SQL (49)
      • PYTHON (39)
      • 통계,검정,머신러닝 (22)
      • TABLEAU (5)
      • 내배캠 | 데이터분석 부트캠프 (12)
  • 블로그 메뉴

    • 홈
  • 링크

  • 공지사항

  • 인기 글

  • 태그

    머신러닝
    해커랭크
    MySQL
    오블완
    태블로
    데이터리안
    코테준비
    티스토리챌린지
    파이썬
    SQL
    Python
    내배캠
    데이터분석
    코딩테스트준비
    프로그래머스
    데이터분석프로젝트
    pandas
    Wil
    sql코딩테스트
    데이터분석가
  • 최근 댓글

  • 최근 글

  • hELLO· Designed By정상우.v4.10.1
성장하는 쿠키의 로그 기록
데이터 전처리 | Pandas 기본 함수 3 (concat,merge,groupby,pivot_table,sort_value)
상단으로

티스토리툴바