본문 바로가기
Python/Data Analysis

[파이썬, Python] Pandas 모듈 - 6️⃣ 데이터프레임 합치기, 등수 매기기 rank(), 날짜 타입(datetime)

by coding-choonsik 2023. 6. 12.
728x90
반응형
SMALL

1. 데이터프레임 합치기

df1 = pd.read_csv('http://bit.ly/ds-korean-idol')
df2 = pd.read_csv('https://bit.ly/ds-korean-idol-2')
# 데이터프레임 확인
df1

 

df2

df_copy = df1.copy()  # 행 방향으로 합치기 위해 copy해줌, 다른 메모리 주소

1-1. concat()

  • 데이터프레임을 합침
  • sort=False 옵션으로 순서가 기존 순서로 유지되도록 함
  • 기본적으로 axis=0이 생략되어있음(행으로 더해짐)
df_concat = pd.concat([df1, df_copy], sort=False)
df_concat

▲ 복사된 df1 데이터프레임이 행방향으로 합쳐짐

 

reset_index(): index를 새롭게 재정의하여 적용, drop=True 옵션으로 기존 index를 삭제, drop=True를 안해주게되면 기존 인덱스와 새로운 인덱스로 생김

df_concat.reset_index(drop=True)

▲ index값이 0부터 재설정

 

✅ axis 옵션으로 열 방향으로 합치기

  • axis=0(행)
  • axis=1(열)
# 열로 합침, 같은 index와 결합(0~14에 일치하는 데이터끼리 합친것임)
pd.concat([df1, df2], axis=1)

 

✅ concat() 시 index의 값이 다를 경우

df3 = df2.drop([3,5])  # 3번, 5번 인덱스의 데이터를 행 방향으로 제거
df3

 

pd.concat([df1, df3], axis=1)  # drop한 index에 대한 값은 NaN (index로 합쳤기 때문에)


# 망가진 데이터 재설정
df1 = pd.read_csv('http://bit.ly/ds-korean-idol')
df2 = pd.read_csv('https://bit.ly/ds-korean-idol-2')
# df2에서 인덱스번호 1,3,5,7,9번 데이터를 행방향으로 제거하고 새로운 변수에 저장
df_right = df2.drop([1,3,5,7,9], axis=0)
df_right

df_right =df_right.reset_index(drop=True)  # 인덱스 번호 재설정
df_right

 

pd.concat([df1, df_right], axis=1)    # index가 맞지 않으면 데이터가 망가짐!


1-2.  merge()

  • 특정 고유한 키(unique, idx)값을 기준으로 합침
  • merge(데이터프레임1, 데이터프레임2, on='고유한 키', how='병합의 기준')
  • 병합의 기준: left, right, inner (SQL 조인과 비슷)
# 이름이 같은 데이터끼리 합침(left 테이블을 기준으로 합침 -> 오른쪽 테이블
pd.merge(df1, df_right, on='이름',how='left')

# 교집합(양쪽 모두 이름이 같고 데이터가 있는것만 나옴)
pd.merge(df1, df_right, on='이름',how='inner')

 

# df_right에 새로운 데이터 추가
df_right = df_right.append({'이름':'김사과', '연봉':5000, '가족수':5},ignore_index=True)
df_right

 

pd.merge(df1, df_right, on='이름',how='right')  # 오른쪽 데이터프레임은 다 나오고 없는 데이터는 NaN

# df_right의 컬럼명 변경
df_right.columns= ['성함','연봉','가족수']
df_right

pd.merge(df1, df_right, on='이름',how='left')  

>>> KeyError: '이름'     # df1과 merge시 이름과 성함이 다른 이름의 컬럼이기 때문에 에러남

 

# left_on과  right_on 옵션을 주어 합칠 열에 대한 정보를 넘겨줌
pd.merge(df1, df_right, left_on='이름', right_on='성함',how='left')


2. 등수 매기기, rank()

  • 데이터프레임 또는 시리즈의 순위를 매기는 함수, 기본값은 ascending(오름차순)
# 브랜드 평판지수로 등수 매겨 새로운 파생변수로 저장
df1['브랜드 순위'] = df1['브랜드평판지수'].rank()
df1

 

# 높은 사람이 1등으로 나오게 내림차순 하기
df1['브랜드 순위'] = df1['브랜드평판지수'].rank(ascending=False)  
df1

 

# 순위를 정수형으로 바꿈
# 특정 열(시리즈)의 dtype을 변경 
# astype(): 특정열의 자료형을 변경
df1['브랜드 순위'] =df1['브랜드 순위'].astype('int')
df1

df1['브랜드 순위'].dtypes
>>> dtype('int64')

3. 날짜 타입(datetime)

df.info()

▲ 생년월일이 string 타입임

 

✅ to_datetime(): object 타입에서 datatime타입으로 변환

df['생년월일'] = pd.to_datetime(df['생년월일'])
df.info()

 

 

✅ datetime형에서 데이터 추출하기

df['생년월일'].dt.year

 

df['생년월일'].dt.month

df['생년월일'].dt.day

df['생년월일'].dt.hour

▲ 시간에 대한 정보가 없기 때문!

df['생년월일'].dt.minute

▲ 시간에 대한 정보가 없기 때문!

df['생년월일'].dt.second

▲ 시간에 대한 정보가 없기 때문!

# dayofweek: 요일 정보, 0(월요일) ~ 6(일요일)
df['생년월일'].dt.dayofweek

# isocalendar().week: 1년(52주 중)에 몇번째 주인지 
df['생년월일'].dt.isocalendar().week

 

 

728x90
반응형
LIST