학습 날짜: 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")
'LG U+ Why Not SW Camp 8기 > 학습 로그' 카테고리의 다른 글
| 공부 일지 #23 | Python Pandas 데이터 분석 기초 함수 (0) | 2025.08.19 |
|---|---|
| 공부 일지 #22 | 데이터 분석 기초 정리2: 자유도, 분포, 기초통계량 (3) | 2025.08.18 |
| 공부 일지 #20 | 데이터 분석 기초 정리1: 표본·표집·확률·확률변수 (7) | 2025.08.14 |
| 공부 일지 #19 | SQL Toy project: CRM 프로그램 만들기 (6) | 2025.08.13 |
| 공부 일지 #18 | 이틀치 SQL 따라잡기: DDL, DML, TCL, INDEX, VIEW (4) | 2025.08.08 |