TOP
본문 바로가기
📚 목차
자격증/빅데이터분석기사

[빅분기 실기] 작업형 1유형 판다스 중요 문법 정리

by 기록자_Recordian 2025. 6. 7.
728x90
반응형
이전 내용
 

[빅분기 실기] 작업형 1유형: transfrom('mean') vs mean()

이전 내용 [빅분기 실기] 실기 체험환경 (groom)이전 내용 [빅분기 실기] 작업형 3유형 요약이전 내용 [빅분기 실기] 작업형 3유형 : 로지스틱 회귀 분석이전 내용 [빅분기 실기] 작업형 3유형 : 회귀

puppy-foot-it.tistory.com


작업형 1유형 - 판다스 중요 문법 정리

 

0. 집계 함수

함수 이름 의미
'mean' 평균
'sum' 합계
'count' 개수
'max' 최대
'min' 최소

1. inplace=True

  • 변경 사항이 원본 데이터프레임에 적용됨.

2. int(값 또는 변수), round(값 또는 변수, 소수점 자리 수)

  • 문제 중 정수로 출력하라고 할 경우 앞에 int() 함수를 써야 하는 것을 잊으면 안 된다.
  • 비슷한 맥락으로, 소수점 몇 째자리까지 출력하라고 할 경우 round() 함수를 적용해야 한다.
  • ex) 소수점 둘 째자리: round(값, 2)

3. 데이터프레임 조건 적용

  • ex1) cond = df['score'] >= 80 ▶ score 컬럼에서 80점 이상
  • ex2) cond = df['지역'].str.contains('서울') ▶ 지역 컬럼 중에서 '서울' 을 포함하고 있는 값
  • 적용 방법: df = df[cond]
  • 여러 조건 적용 시, df = df[cond1 & cond2] ※ cond1, cond2 조건 미리 적용 필요

4. 날짜 찾기

  • 먼저 해당 열을 datetime으로 형변환 (df['날짜''] = pd.to_datetime(df['날짜'])
  • 찾는 값이 연 / 월 / 일 / 요일 / 시간.. 에 따라 df['날짜'].dt.year / dt.month / dt.day / dt.dayofweek / dt.hour ..
  • ★ 중요! 뒤에 () 없음
  • ex) 요일 찾고 주말 여부 계산하기
# 출근시간 컬럼 형변환 (datetime)
df['출근시간'] = pd.to_datetime(df['출근시간'])

# 요일 추출 
df['출근요일'] = df['출근시간'].dt.dayofweek # 요일에 따라 0~6의 값으로 반환

# 주말 여부
df['주말출근여부'] = df['출근요일'] > 4 # 4초과 값은 True (주말), 작은 값은 False (평일)

5. 최빈값 찾기

  • .mode()[0] : 가장 빈도가 높은 값
  • ex) df['성적'].mode()[0] ▶ 성적 컬럼 중에서 가장 빈도가 높은 값

6. 특정 컬럼 기준 계산(groupby)

  • df.groupby('기준컬럼').mean(numeric_only=True) : mean 외에도 sum 등 다양한 연산 함수 가능

7. 앞에서 부터 xx% 데이터 구하기

  • len(df) * xx)
  • ex) 앞에서 부터 70% 값 구하기: len(df) * 0.7
  • ※ 소수점 이하 값 버리기: int() 로 감싸줌 ▶ int(len(df) * 0.7)
  • 슬라이싱: df.iloc(int(len(df) * 0.7)) ▶ int~ 부분을 미리 변수에 저장하고 변수만 호출하는 게 더 가독성이 좋다

8. 특정 컬럼의 결측치 제거

  • df = df.dropna() : 모든 컬럼의 결측치 제거
  • df = df.dropna(subset=['컬럼명']) : 특정 컬럼명의 결측치만 제거

9. 여러 값 변환 map

  • map(): 딕셔너리의 키와 쌍 값 사용하여 각 컬럼 값을 특정 값으로 매핑
dict_list = {np.nan: 0, 'silver': 1, 'gold': 2, 'vip': 3}
df['f3'] = df['f3'].map(dict_list)
day_mapping = {
	'월': '평일', '화': '평일', '수': '평일', 
    '목': '평일', '금': '평일', 
    '토': '주말', '일': '주말'}

df['주말여부'] = df['요일'].map(day_mapping)

10. 특정 자료형 컬럼 찾기

  • select_dtypes().columns()
  • select_dtypes(include='xx').columns(): xx 포함
  • select_dtypes(exclude='xx').columns(): xx 제외

11. 소수점 유무에 다른 선택

  • df['평균'] == round(df['평균'], 0): 평균 컬럼 중 소수점이 있는 값만 선택
  • df['평균'] != round(df['평균'], 0): 평균 컬럼 중 소수점이 없는 값만 선택

12. 데이터 로드 시 인덱스 지정하기

  • pd.read_csv(파일, index_col='인덱스 지정할 컬럼')

13. 행별 계산

  • df.loc['index'].연산
  • ex) df.loc[2001].sum(): 2001 인덱스 행 합계 계산

14. 결측치 채우기 (fillna)

  • df = df.fillna()
  • 특정 조건으로 채우기
freq = df['성적'].mode()[0] # 성적 컬럼의 최빈값
df = df.fillna(freq, inplace=True) # 결측치를 최빈값으로 채움
  • 앞의 값으로 채우기: df = df.fillna(method='ffill')
  • 뒤의 값으로 채우기: df = df.fillna(method='bfill')

15. reset_index()

  • 그룹핑(groupby) 이후 만들어진 멀티인덱스를 컬럼으로 만들고, 인덱스를 새롭게 매김
df = df.gropupby(['city'], ['month']).sum().reset_index()

16. 날짜 자료형의 그룹핑

  • 자료형이 날짜여도 그룹핑 가능
  • ex) 주문일자를 토대로 월별 집계
# datetime으로 형변환
df['주문일자'] = pd.to_datetime(df['주문일자'])

# 주문일자 중 월 값 추출
df['month'] = df['주문일자'].dt.month

# 월별 집계
monthly_df = df.groupby('month').sum(numeric_only=True)

17. 시간 계산 (ex. 지연 시간, 소요 시간 등)

  • ex) 소요 시간 계산
  • 시간 계산 후, dt.total_seconds(): 전체 시간을 초 단위로 변경
  • / 60: 분 단위로 변환, / 3600: 시간 단위로 변환
# '출발시간', '도착시간' 컬럼이 있다고 가정
# 먼저 datetime으로 형변환
df['출발시간'] = pd.to_datetime(df['출발시간'])
df['도착시간'] = pd.to_datetime(df['도착시간'])

# 소요시간 계산 (분 단위)
df['소요시간'] = (df['도착시간'] - df['출발시간']).dt.total_seconds()/ 60

# 소요시간 계산 (시간 단위)
df['소요시간'] = (df['도착시간'] - df['출발시간']).dt.total_seconds()/ 3600

18. 특정 조건별 지연시간 발생한 비율

  • ex) 택배 회사별 예정 시간보다 늦게 도착한 주문 비율
  • True는 1, False는 0 이므로 mean() 함수를 적용하면 이들의 평균값(비율) 반환
# 실제 도착 시간, 예정 도착 시간 형변환(datetime)
df['실제도착시간'] = pd.to_datetime(df['실제도착시간'])
df['예상도착시간'] = pd.to_datetime(df['예상도착시간'])

# 지연 시간 계산
df['지연시간'] = df['실제도착시간'] - df['예상도착시간'] # 양수: 지연시간 발생 / 음수: 빨리 도착

# 지연 여부 출력 (boolean 값 반환)
df['지연여부'] = df['지연시간'] > 0 # 지연시간이 0보다 클 경우 True (지연발생), 작을 경우 False (미발생)

# 택배회사별 지연 발생 비율 계산
df = df.groupby('택배회사')['지연여부'].mean()

19.  값 찾기: isin()

  • isin() 함수를 통해 필터링 가능
  • 리스트 형태를 입력값으로 받아 리스트에 있는 값을 한 번에 찾음
  • ex) 고객별 주문 금액 합계가 300,000원 이상인 고객들 필터링
# 고객별 구매금액 합계
df_amount = df.groupby('customer')['purchase'].sum()

# 구매금액 합계가 300,000인 이상 조건
cond = df_amount >= 300000

# 조건 적용
df_amount = df_amount[cond]

# 원본 데이터프레임에 필터링 적용
filtered_data = df[df['customer'].isin(df_amount.index)]

20. 시간 간의 차이 계산(일)

  • 각 사용자별로 첫 주문과 마지막 주문 사이의 시간 간격을 일 단위로 계산
  • 시간차가 0일인 사용자를 제외하고, 나머지 사용자들의 평균 시간 간격(일 단위) 계산
  • 평균 시간 간격보다 긴 시간 간격을 가진 사용자의 수를 정수로 출력
# 1. 각 사용자별로 첫 주문과 마지막 주문 사이의 시간 간격을 일 단위로 계산
df['주문시간'] = pd.to_datetime(df['주문시간'])

min_order = df.groupby('user')['주문시간'].min()
max_order = df.groupby('user')['주문시간'].max()

order_diff = (max_order - min_order).dt.days

# 2. 시간차가 0일인 사용자를 제외하고, 나머지 사용자들의 평균 시간 간격(일 단위) 계산
cond1 = order_diff > 0

mean_order = order_diff[cond1].mean()

# 3. 평균 시간 간격보다 긴 시간 간격을 가진 사용자의 수를 정수로 출력
cond2 = order_diff > mean_order
user_count = len(order_diff[cond2])
print(user_count)

 

  • 첫 날짜 min(), 마지막 날짜 max()
  • 차이: (max - min).dt.days

21. 연-월 구하기

  • dt.to_period('M') 으로 연-월 값 구하기 가능
# 1. 주문이 가장 많이 발생한 연-월
df['주문시간'] = pd.to_datetime(df['주문시간'])
df['order_ym'] = df['주문시간'].dt.to_period('M')
# print(df)

most_ym = df.groupby('order_ym')['주문시간'].count()

# 2. 해당 연-월에 '쿠팡이츠' 앱을 통한 주문 중 '만나서결제'로 결제된 주문의 비율 계산
# (반올림 후 소수 둘째 자리까지 계산)
cond1 = df['order_ym'] == most_ym.idxmax()
cond2 = df['앱종류'] == '쿠팡이츠'
filtered_data = df[cond1 & cond2]

cond3 = filtered_data['결제종류'] == '만나서결제'
result = len(filtered_data[cond3]) / len(filtered_data)
print(round(result, 2))

22. 함수 적용 

  • df['컬럼'].apply(함수)
  • ex) 거리에 따른 배달료 계산
# 1. 배달료 계산 기준표에 따라 각 주문에 대한 배달료 계산
def del_fee(distance):
  if distance < 5:
    return 3000
  elif distance < 10:
    return 5000
  elif distance < 15:
    return 7000
  elif distance < 20:
    return 8000

df['배달료'] = df['거리'].apply(del_fee)

23. 'user' 컬럼 값에서 숫자만 추출하기

  • 'user' 컬럼 값 형식: user_숫자
  • 숫자 값만 필요하여 해당 값만 추출하고, 숫자 값을 모두 더하기
# 1. 'user' 컬럼에서 user 뒤에 있는 숫자 값만 출력
df['user_int'] = df['user'].str[5:]
# print(df)

# 2. 추출된 숫자 값을 모두 합한 값을 정수로 출력
df['user_int'] = df['user_int'].astype(int)
result = df['user_int'].sum()

24.  여러 컬럼 합 구하기

  • df[] 내에 리스트 형태로 값 주면 됨
  • axis=1: 열 방향
df['total'] = df[['1분기', '2분기', '3분기', '4분기']].sum(axis=1)

25. xx컬럼 기준 상위 (하위) n 번째 구하기

  • 상위 n 번째: nlargest(n)
  • 하위 n 번째: nsmallest(n)
  • xx 컬럼 중 상위(하위) n 번째: nlargest(n, 'xx') / nsmallest(n, 'xx')
# 1. 수학, 영어, 국어 점수의 합 구하기
# df['total'] = df['수학'] + df['영어'] + df['국어']

# 2. 합이 가장 큰 상위 10명 찾기
top_10 = df.nlargest(10, 'total')

26. melt (프레임 재구조화) 

  • 넓은 형태 → 긴 형태
  • pd.melt(df, id_vars: 유지할 변수 (필수), value_vars=변환할 열 (선택), var_name='변환된 열 이름', value_name='값의 열 이름')
  • 변환할 열에는 여러 컬럼이 올 수 있으며, 리스트 형태로 입력되면 된다.
melted_df = pd.melt(df, 
                    id_vars=['지역'],  # 유지할 변수
                    value_vars=['1분기', '2분기', '3분기'], # 변환될 열
                    var_name='분기', # 변환된 이름
                    value_name='판매금액') # 값의 이름

# 지역과 분기별 매출액 합계
df = melted_df.groupby(['지역', '분기'])['판매금액'].sum().reset_index()

# 매출액 합계가 1500을 초과하는 건수 계산
cond = df['판매금액'] > 1500
print(len(df[cond]))

 

★ melt가 어렵다면?

melt 안 쓰고 더 쉽게 풀기


27. 데이터 병합 (concat, merge)

  • concat: df = pd.concat([df1, df2], axis=1)
  • 기본값은 위아래 병합, axis=1은 왼쪽에서 오른쪽으로 병합
  • merge: 두 개 이상의 데이터프레임을 공통 열 또는 인덱스 기준으로 병합
  • df = df1.merge(df2, how='inner', on='기준 열 또는 인덱스')
  • how 파라미터는 두 데이터프레임을 합칠 때 사용하는 조인 방식(inner, outer, left, right, cross)을 지정하며, 기본값은 inner.
[how 파라미터 종류]
- inner: 두 데이터프레임의 공통된 키(key) 값만 포함하여 병합.

- outer: 두 데이터프레임의 모든 키 값을 포함하여 병합. 키 값이 한쪽에만 있는 경우도 포함.
- left: 왼쪽 데이터프레임을 기준으로 병합.
- right: 오른쪽 데이터프레임을 기준으로 병합.
- cross: 두 데이터프레임의 모든 조합을 생성.

28. transform 

[빅분기 실기] 작업형 1유형: transfrom('mean') vs mean()

  • 같은 그룹 내에서 특정 기준에 맞는 연산 수행
  • ex) 이동수단별 주유금액 평균
  • m_amount = df.groupby('이동수단')['주유금액'].transform('mean')

29.  unstack (재구조화)

  • groupby 이후 다중 인덱스 설정된 상태에서 특정 인덱스를 컬럼으로 변환
용어 설명
stack() 열을 행으로 바꿈 (반대 방향)
unstack() 행을 열로 바꿈
level= 어떤 인덱스를 열로 뺄지 지정 가능

30. pivot_table 

  • 표 형태의 데이터를 요약/집계
pd.pivot_table(dataframe, 
               index='행으로 쓸 열',
               columns='열로 쓸 열',
               values='값으로 쓸 열',
               aggfunc='집계 함수')

다음 내용

 

[빅분기 실기] 작업형 3유형: groom 체험 문제 풀이

이전 내용 [빅분기 실기] 작업형 1유형 판다스 중요 문법 정리이전 내용 [빅분기 실기] 작업형 1유형: transfrom('mean') vs mean()이전 내용 [빅분기 실기] 실기 체험환경 (groom)이전 내용 [빅분기 실기] 작

puppy-foot-it.tistory.com

728x90
반응형