본문 바로가기

공부 일지 #21 | Python Pandas 기본 문법 정리: 데이터 전처리 기초

@studying:)2025. 8. 14. 19:33

학습 날짜: 2025.08.13 ~ 2025.08.14


통계 공부 시작과 함께 매일 오후에는 Pandas 실습을 진행되었다. 수업에서 다룬 기본 문법과 실습 코드를 간단히 정리보았다.

 

Column 관련 함수

  • df.columns: 칼럼 이름 가져오기
  • df.columns.name = "구분" : 칼럼 대표이름 수정하기
  • df.index.name = "순서": 칼럼 index의 대표이름 수정하기
  • df['칼럼 이름'] = [data] : 새 칼럼 만들기 * 행 개수에 맞게 데이터 입력해주어야 함!
'''
Q6) etc 컬럼에 값이 서비스 UI에서 0.3, 0.5, 0.1로 입력되었습니다.
    입력된 값을 dataframe에 넣어주세요.
'''
df["etc"] = [0.3, 0.5, 0.1,np.nan] # 값 없으면, NULL 값으로 갯수 채워주기
  • df['칼럼 이름'] = np.ones(row 개수) : 모두 같은 상수값을 갖는 열을 추가할 때
'''
Q7) etc컬럼의 값이 한번더 변경되었습니다.
    all 3.0으로 바꿔주세요. 단 np.ones(shape)를 사용하세요.
'''
df["etc"] = np.ones(4)*3
df
  • df['칼럼 이름'] = 계산식 : 연산된 값을 갖는 새 컬럼을 추가할 때
'''
-homeworks column 생성
Q8) hw column을 만들고, Lee:70, Hwang:80, kim:90, Choi: 100 을 부여했습니다.
    이후, score 값과 평균을 낸 결과를 mean_score column에 저장하고 싶습니다.
'''
df['hw'] = [70, 80, 90, 100]
df['mean_score'] = (df['score'] + df['hw'])/2  # ⇒ 병렬 연산이 가능함

# 집계함수 활용
target_cols = ['score', 'hw']
df["mean_score"] = df[target_cols].mean(axis=1) 
# axis = 1 행 방향 계산 / axis = 0 열 방향 계산 → 집계연산시 활용 가능
df
'''
병렬연산이 가능한 이유

dataframe의 column을 구성하는 데이터타입인 series란?

* Pandas에서 Series = 1차원 데이터 구조, 리스트나 배열처럼 값을 순서대로 저장하지만, 인덱스(index)라는 라벨이 붙어 있음

DataFrame = 여러 개의 Series를 열 방향(axis=1)으로 합친 것, 각 컬럼(column)이 하나의 Series로 존재
그래서 값을 리스트로 넣어주지만, 그 값들이 한 열의 값으로 들어가는 것
값들이 행렬로 들어가 있기에 원소별 병렬연산, 행렬 곱 등이 가능
'''
  • df['칼럼 이름'] = 조건식 : 조건식의 결과값(True, False)를 값으로 갖는 칼럼을 추가할 때
'''
Q9) mean_score > 90 이면 True, 아니라면, False로 구성된  pass column을 구성하세요.
'''
df['pass'] = df['mean_score'] > 90
df
  • df[칼럼 이름] : 칼럼 값을 보고자 할 때, 다중 칼럼을 보고 싶으면 리스트 형태로 넣으면 됨
'''
Q7) score와 etc 2개의 컬럼값들을 보고 싶습니다.
'''
df[['score', 'etc']] # 여러 개의 컬럼을 보고 싶으면 리스트 형태로 넣어주어야 함

# 아래가 더 가독성이 좋음
cols = ['score', 'etc']
df[cols]
  • df.drop(칼럼명): 열 삭제
'''
Q10) etc column은 더이상 사용되지 않습니다. 삭제해주세요.
'''
df.drop('etc', axis = 1) # axis = 1 열 삭제, axis = 0 행 삭제(default)
df # update 안됐음

df.drop('etc', axis = 1, inplace=True) # inplace = True 데이터프레임에 바로 적용
df # update 됨

# 또는
# df = df.drop('etc', axis = 1)

 

데이터 조회(loc, iloc)

df[0:1] # 인덱스 범위로 행 선택 시 의미가 불분명해질 수 있어 사용 자제 권장

dataframe.loc(row,col)

- 라벨 기반

- row : index, 조건식도 가능
- col : column 명(series의 이름), 조건식도 가능

print(df.loc[df['name'] == 'Lee']) # 라벨 기반


# 인덱스가 0~2인 행에서, 'name'부터 'grade'인 열 정보를 가져오세요.
print(df.loc[0:2, 'name':'grade'])


'''
Q2) col mean_score > 90 인 row에서 column grade, pass 데이터를 가져오세요.
'''
cond = (df['mean_score'] > 90)
target_cols = ['grade', 'pass']

df.loc[cond, target_cols] # 이렇게 쓰도록 연습하기. 보기 더 깔끔하기 때문에.


# & ==> and의 의미 ==> 곱하기의 의미 ==>결과는 참이냐 거짓이냐
# pass 변수값이 True 이고, score 변수값이 90 을 초과하는 행만 가져오세요.
cond = (df['pass'] == True) & (df['score'] > 90)
df.loc[cond, ] # 이렇게 쓰는 것을 더 추천 for 가독성

dataframe.iloc[row, col]

- 위치 기반

- default index를 사용, set_index를 통해 index를 바꿔도, default index는 계속 존재함
- 정수값만 row, col에 들어감

print(df.iloc[0]) # 위치 기반

df.iloc[0:1, ] # 행, 열 조건 구분을 위해 항상 , 쓰는 것을 권장
df.iloc[0:2, 1:4] # 위치 기반이기 때문에 열 이름이 아닌 인덱스로 작성해야 함

# 인덱스가 0~2인 행에서, 'name'부터 'grade'인 열 정보를 가져오세요.
target_cols = ['name', 'score', 'grade']
print(df.iloc[0:3][target_cols]) # 이렇게도 가능

 

NaN 데이터 처리 (= 결측값 처리)

NaN 검색 방법

'''
nan data 검색 방법 1
'''
df.info()

'''
nan data 검색 방법 2
'''
df.isnull().sum()

 

NaN 처리

'''
NAN 처리 : row 에 하나라도 nan이 있다면, 해당 row를 지워줍니다.
NAN 데이터를 지우고 그 dataframe을 반환합니다.
'''
df3.dropna(inplace = True)
df3


'''
NAN 처리 : row 전체가 NAN 데이터인 데이터를 지우고 그 dataframe을 반환합니다.
'''
# df3.isnull().sum() # Null 개수 확인
df3.dropna(how = "all", inplace = True) # how = "all" : row 전체가 NaN인 경우 삭제
df3

 

NaN 값을 다른 값으로 채우기

# NAN data를 'not null' 문자열로 채우세요.
df4.fillna(value = 'not null', inplace = True)
df4

 

DataFrame Sorting

#default ascending order
df.sort_index() 

# descending 내림차순
df.sort_index(ascending=False)

# column name으로 오름차순
df.sort_index(axis=1)

# column name으로 내림차순
df.sort_index(axis=1, ascending=False)

# 값을 기준으로 정렬: grade 값을 기준으로 오름차순
df.sort_values(by='grade')

# grade 값을 기준으로 내림차순
df.sort_values(by='grade',ascending=False)

# 여러 값을 기준으로 정렬 가능
cols = ["grade", "hw"] # column names
df.sort_values(by=cols,ascending=False)

 

Aggregation Function

Aggregation Function

#DataFrame의 연속형 데이터의 기초통계량 확인하기
df5.describe()

# object 타입(문자열, 범주형 데이터) 열만 대상으로 통계를 생성
df5.describe(include=['O'])  # 알파벳 O

#단일 변수('score')의 통계량 확인하기
df5['score'].describe()

#집계함수(sum)와 축(전체)
# score변수의 전체 합의 결과를 출력해보세요.
df5['score'].sum()
# 또는
cols = ['score']
df5.loc[:, cols].sum()

#집계함수와 축(행의 방향)
# score, hw, mean_score 변수 각각의 합의 결과를 출력해보세요.
sum_cols = ['score', 'hw', 'mean_score']
df5[sum_cols].sum(axis=1)

#집계함수와 축(열의방향)
# score, hw, mean_score 변수의 합의 결과를 출력해보세요
df5[sum_cols].sum(axis=0)

 

Groupby

집단별 통계치를 보고 싶을 때 사용.

  • groupby()의 내장 함수
    • count()
    • sum()
    • mean()
    • var()
    • std()
    • min()/max() 
  • 주의사항 : sum(), mean, var(), std, min/max() 등은 그룹의 산술통계를 의미하기 때문에 숫자형 데이터 컬럼에만 적용됨
#각 그룹별 행의 개수를 알 수 있습니다.
df.groupby('gender').count()

#숫자형 데이터 컬럼만 나타내는 것을 볼 수 있습니다.
df.groupby('gender')["age_of_driver"].mean()

#grade --> name 순으로 그룹을 형성한것 입니다.
group_cols = ["gender","living_status"]
trarget_cols = ["claim_est_payout"]
# df.groupby(group_cols)[trarget_cols].mean()
df.groupby(group_cols)[trarget_cols].mean().sort_values(by='claim_est_payout',ascending=True)

 

Apply

DataFrame이나 Series의 각 요소, 행, 열에 함수를 적용하는 메서드

반복문 없이 데이터를 가공·변환할 수 있게 해줌

# 연산이 간단할 때,
test_df['pass']= test_df['age_of_vehicle'].apply(func=lambda x: True if x>=7.0 else False)

# or 연산이 복잡할 때,
# def user_def_fn(column_data):
#   if column_data >=7.0:
#     return True
#   else:
#     return False
# test_df['pass']= test_df['age_of_vehicle'].apply(func = user_def_fn)

cols = ['age_of_vehicle', 'pass']
test_df[cols].head()

 

Pivot Table

엑셀의 피벗 테이블(Pivot Table)과 비슷하게, 행(index), 열(columns), 집계값(values)을 지정해 데이터를 요약하고 통계값을 계산
R에서 파이프(%>%) + summarise() 또는 aggregate()로 하는 요약 작업과 비슷

# index => 그루핑, values => 분석목적, columns => 다양한 관점

# gender 범주별 보험청구금액('claim_est_payout')의 평균값을 출력하세요.
pd.pivot_table(df, index="gender", values="claim_est_payout", aggfunc="mean") # default : mean

# gender 범주별 보험청구금액('clclaim_est_payout')의 sum값을 living_status(거주형태)의 범주 별로 나타내보세요.

pd.pivot_table(df, index='gender', 
               columns='living_status', 
               values="claim_est_payout", 
               aggfunc="sum")

 

Merge(how=left or right) 

SQL의 JOIN과 같은 기능

 

왼쪽 결과에서 원했던 것은 Key column에 값에 맞게 서로 합쳐지길 원했지만, 그 결과를 얻지 못했음...

 

이것이 merge가 필요한 이유!

SQL 처럼 ON을 사용해 공통된 칼럼으로 데이터를 병합할 수 있기

때문에.

 

 

# left merge
pd.merge(left_df, right_df, on="key", how="left")

# right merge
pd.merge(left_df, right_df, on="key", how="right")

# inner merge
pd.merge(left_df, right_df, on="key", how="inner")

# outer merget
pd.merge(left_df, right_df, on="key", how="outer")

# 기준 칼럼 이름이 다를 경우, 모두 작성해주어야 함
pd.merge(left_df, right_df, left_on='x1', right_on='x2', how="inner")

 

studying:)
@studying:) :: what i studied

studying:) 님의 학습 여정을 기록하는 블로그입니다.

목차