Pandas 전처리 연습(3)

SeongGyun Hong·2024년 10월 29일

빅데이터 분석기사

목록 보기
3/16

1. Pandas Datetime Accessor (dt)

Pandas의 dt 접근자는 날짜와 시간을 다루기 위한 다양한 속성과 메서드를 제공한다.
아래는 자주 사용되는 속성과 메서드이다.

주요 속성

속성설명예시
dt.year연도를 추출df['date'].dt.year
dt.month월을 추출df['date'].dt.month
dt.day일을 추출df['date'].dt.day
dt.hour시간을 추출df['date'].dt.hour
dt.minute분을 추출df['date'].dt.minute
dt.second초를 추출df['date'].dt.second
dt.date날짜 부분만 추출df['date'].dt.date
dt.time시간 부분만 추출df['date'].dt.time
dt.weekday요일(0=월요일, 6=일요일)을 추출df['date'].dt.weekday
dt.is_leap_year윤년 여부를 나타냄df['date'].dt.is_leap_year
dt.days_in_month해당 월의 일 수를 반환df['date'].dt.days_in_month

주요 메서드

메서드설명예시
dt.strftime(format)날짜를 주어진 형식의 문자열로 변환df['date'].dt.strftime('%Y-%m-%d')
dt.floor(freq)주어진 빈도에 따라 날짜를 내림df['date'].dt.floor('D')
dt.ceil(freq)주어진 빈도에 따라 날짜를 올림df['date'].dt.ceil('D')
dt.round(freq)주어진 빈도에 따라 날짜를 반올림df['date'].dt.round('H')

2. isin 메서드

  • 형식: Series.isin(값_목록)
  • 반환값: 값이 목록에 포함되면 True, 포함되지 않으면 False
  • 용도: 특정 열의 값이 지정된 목록에 포함되는지를 빠르게 확인하고, 그에 따라 데이터 프레임의 행을 필터링할 수 있음

코드 분석 예시

answer = video[['viewcnt', 'ct', 'videoname']]
answer = answer[answer.ct.dt.date.isin(target.ct.dt.date)]
  1. .dt.date: datetime 객체에서 연-월-일만 추출해 시, 분, 초를 제외하고 날짜 값만 얻음.
  2. isin(target.ct.dt.date): target의 날짜 목록을 기준으로 answerct 열에 있는 날짜가 포함되는지 여부를 반환.
  3. 결과: answer 데이터프레임의 ct 열에서 target 날짜 목록에 해당하는 행만 남기게 됨.

요약

isin은 두 데이터프레임 간 날짜, ID 등의 공통 항목을 기준으로 데이터를 필터링하거나 특정 조건에 맞는 행을 빠르게 선택할 때 매우 유용함.

3. groupby와 agg의 사용

  1. groupby: 특정 열을 기준으로 데이터를 그룹화함.
  2. agg: 그룹화된 각 그룹에 대해 다양한 집계 연산을 동시에 적용할 수 있도록 함.

기본 형식

df.groupby('그룹화_기준_열').agg(집계_연산)
  • 그룹화_기준_열: 그룹을 나눌 기준이 되는 열
  • 집계_연산: 적용할 연산의 종류, 함수 또는 함수의 목록

agg의 활용 방식

1. 단일 집계 함수 적용

열에 하나의 집계 함수를 적용하여 결과를 반환함. 예를 들어, sum, mean 등과 같은 함수가 사용될 수 있음.

# 각 그룹의 'viewcnt' 합계를 구함
df.groupby('videoname').agg({'viewcnt': 'sum'})

2. 여러 열에 서로 다른 집계 함수 적용

dict를 사용하여 열마다 다른 집계 함수를 지정할 수 있음. 이 방식은 열마다 서로 다른 요약 통계를 구할 때 유용함.

# 'viewcnt'는 합계, 'likes'는 평균을 계산함
df.groupby('videoname').agg({'viewcnt': 'sum', 'likes': 'mean'})

3. 단일 열에 여러 집계 함수 적용

리스트를 사용하여 특정 열에 여러 개의 집계 함수를 동시에 적용할 수 있음.

# 'viewcnt'에 대해 합계와 평균을 동시에 계산함
df.groupby('videoname').agg({'viewcnt': ['sum', 'mean']})

4. 여러 열에 여러 집계 함수 적용

여러 열에 대해 여러 집계 함수를 조합하여 사용할 수 있음.

# 'viewcnt'는 합계와 평균, 'likes'는 최대값과 최소값을 계산함
df.groupby('videoname').agg({
    'viewcnt': ['sum', 'mean'],
    'likes': ['max', 'min']
})

고급 사용법

사용자 정의 함수 적용

agg를 사용하여 사용자 정의 함수를 적용할 수도 있음. 익명 함수(lambda)를 사용하거나 미리 정의한 함수를 적용할 수 있음.

# 'viewcnt'에서 중위수를 계산하는 사용자 정의 함수 적용
df.groupby('videoname').agg({'viewcnt': lambda x: x.median()})

groupbyagg 활용

data = {
    'videoname': ['공범_1', '공범_1', '공범_2', '공범_2', '공범_3', '공범_3'],
    'viewcnt': [150, 200, 250, 300, 100, 50],
    'likes': [10, 20, 15, 25, 5, 7]
}
df = pd.DataFrame(data)

# 'videoname' 별로 'viewcnt'의 합계와 'likes'의 평균을 구함
result = df.groupby('videoname').agg({'viewcnt': 'sum', 'likes': 'mean'})
print(result)

출력:

          viewcnt  likes
videoname                
공범_1          350   15.0
공범_2          550   20.0
공범_3          150    6.0

요약

  • groupbyagg 조합을 사용하면 여러 열에 대해 서로 다른 집계 함수를 동시에 적용할 수 있음.
  • 집계 함수로는 기본 함수(sum, mean 등)뿐만 아니라 사용자 정의 함수도 사용 가능.
  • aggdict 또는 list로 집계 함수를 전달하여 각 열에 대해 개별 설정이 가능함.

4. duplicated와 (index, drop_duplicates)의 차이

duplicateddrop_duplicates에 대한 설명

duplicateddrop_duplicatesPandas에서 데이터프레임의 중복된 데이터를 다루기 위해 사용되는 메서드. duplicated는 중복 여부를 판별하고, drop_duplicates는 중복된 데이터를 제거하여 새로운 데이터프레임을 반환함. 둘 다 특정 열에 대해서만 중복을 판별할 수 있어 데이터 전처리 시 유용함.

duplicated 메서드

duplicated는 각 행이 이전에 나타난 행과 중복되는지를 TrueFalse로 표시하는 불리언 시리즈를 반환함. 처음 나타난 중복 행은 False, 이후에 동일한 항목이 있으면 True로 표시하여 중복 여부를 확인할 수 있음.

사용 형식

DataFrame.duplicated(subset=None, keep='first')
  • subset: 중복을 확인할 열을 지정함. 여러 열을 확인하려면 리스트 형태로 전달할 수 있음.
  • keep: 중복이 있을 때 어떤 값을 False로 유지할지 결정함.
    • 'first': 처음 나타난 중복 행을 유지하고 이후 중복 행을 True로 표시함.
    • 'last': 마지막으로 나타난 중복 행을 유지하고 앞선 중복 행을 True로 표시함.
    • False: 모든 중복 행을 True로 표시함.

예시

import pandas as pd

data = {
    'ct': ['2024-10-29', '2024-10-30', '2024-10-30', '2024-10-31'],
    'videoname': ['공범_1', '공범_1', '공범_1', '공범_2']
}
df = pd.DataFrame(data)

# 중복 여부 확인
df['is_duplicated'] = df.duplicated(subset=['ct', 'videoname'], keep='first')
print(df)

출력:

            ct videoname  is_duplicated
0  2024-10-29     공범_1          False
1  2024-10-30     공범_1          False
2  2024-10-30     공범_1           True
3  2024-10-31     공범_2          False

위 코드에서, duplicatedctvideoname이 모두 동일한 경우 중복으로 간주함. keep='first'로 지정하여 처음 나타난 중복은 False, 이후 중복은 True로 표시함.


drop_duplicates 메서드

drop_duplicates는 중복된 행을 제거하고 중복되지 않은 고유한 값만 포함하는 새로운 데이터프레임을 반환함. 중복을 판단하는 기준 열을 지정할 수 있으며, 필요에 따라 첫 번째나 마지막 중복을 남길 수도 있음.

사용 형식

DataFrame.drop_duplicates(subset=None, keep='first', inplace=False)
  • subset: 중복 여부를 확인할 열을 지정함. 지정하지 않으면 모든 열을 기준으로 중복을 판단함.
  • keep: 중복이 있을 때 유지할 값을 결정함.
    • 'first': 첫 번째 중복 값을 남기고 이후 중복 행을 제거함.
    • 'last': 마지막 중복 값을 남기고 이전 중복 행을 제거함.
    • False: 중복된 모든 행을 제거함.
  • inplace: True로 설정하면 원본 데이터프레임에서 중복을 제거하고, False로 설정하면 중복이 제거된 새 데이터프레임을 반환함.

예시

# 중복 행 제거
unique_df = df.drop_duplicates(subset=['ct', 'videoname'], keep='first')
print(unique_df)

출력:

            ct videoname
0  2024-10-29     공범_1
1  2024-10-30     공범_1
3  2024-10-31     공범_2

위 코드에서는 drop_duplicates를 사용하여 첫 번째 중복만 남기고 이후 중복된 행을 제거함.


요약

  • duplicated: 데이터프레임에서 중복 여부를 확인하는 불리언 시리즈를 반환함.
  • drop_duplicates: 중복된 행을 제거하여 고유한 값만 남긴 데이터프레임을 반환함.
  • subsetkeep 파라미터를 통해 중복 판단 기준 열과 남길 중복 행을 세부적으로 설정할 수 있음.

5. df.loc와 df.iloc

5.1 df.loc 메서드

  • 기준: 라벨 기반 인덱싱. 즉, 인덱스와 컬럼 이름(라벨)을 기준으로 데이터를 선택함.
  • 형식: df.loc[row_label, column_label]
  • 포함 여부: 지정한 범위의 마지막 인덱스/컬럼을 포함함.

사용 예시

import pandas as pd

data = {
    'A': [1, 2, 3],
    'B': [4, 5, 6],
    'C': [7, 8, 9]
}
df = pd.DataFrame(data, index=['x', 'y', 'z'])

# 특정 라벨 행 선택
print(df.loc['x'])          # 'x' 라벨의 행 전체 선택
print(df.loc['y':'z'])      # 'y'부터 'z'까지 행 선택 (포함됨)

# 특정 라벨 행과 열 선택
print(df.loc['x', 'A'])     # 'x' 행, 'A' 열의 값 선택 (결과: 1)
print(df.loc[:, ['A', 'C']]) # 모든 행에서 'A'와 'C' 열만 선택

출력:

A    1
B    4
C    7
Name: x, dtype: int64

   A  B  C
y  2  5  8
z  3  6  9

1

   A  C
x  1  7
y  2  8
z  3  9

5.2 df.iloc 메서드

  • 기준: 정수 기반 인덱싱. 즉, 데이터프레임에서 정수 인덱스를 기준으로 데이터를 선택함.
  • 형식: df.iloc[row_index, column_index]
  • 포함 여부: 지정한 범위의 마지막 인덱스/컬럼을 포함하지 않음.

사용 예시

# 특정 위치의 값 선택
print(df.iloc[0])           # 첫 번째 행 전체 선택
print(df.iloc[1:3])         # 두 번째부터 세 번째 행 선택 (마지막 포함하지 않음)

# 특정 위치의 행과 열 선택
print(df.iloc[0, 1])        # 첫 번째 행, 두 번째 열 값 선택 (결과: 4)
print(df.iloc[:, [0, 2]])   # 모든 행에서 첫 번째, 세 번째 열 선택

출력:

A    1
B    4
C    7
Name: x, dtype: int64

   A  B  C
y  2  5  8
z  3  6  9

4

   A  C
x  1  7
y  2  8
z  3  9

주요 차이점 요약

특징df.locdf.iloc
인덱싱 기준라벨(인덱스 이름과 컬럼 이름)정수 기반 (위치 인덱스)
마지막 인덱스 포함포함 (loc[1:3])제외 (iloc[1:3])
사용 사례특정 라벨을 기준으로 선택할 때 사용위치 기반으로 데이터를 선택할 때

요약

  • df.loc는 라벨 기반 접근법으로, 인덱스 이름이나 컬럼 이름을 알고 있을 때 사용하기 좋음.
  • df.iloc는 정수 기반 접근법으로, 데이터 위치에 따라 선택할 때 유용함.
profile
헤매는 만큼 자기 땅이다.

0개의 댓글