☑️ 데이터프레임 연결하기 (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 |