contents
summary
데이터 전처리
:내가 원하는 데이터를 보기 위해 하는 모든 활동
Pandas 알아보기
Pandas 구조


-DataFrame = 표 형태
- index : 각 아이템을 특정할 수 있는 고유의 값 (엑셀에서는 좌측 열순서로 생각하면됨)
- columns : 하나의 속성을 가진 데이터 집합
-Series = 하나의 속성을 가진 데이터 집합 (= DataFrame 표에서 열 1줄이라고 생각하면 쉬움)
- value + index
Pandas 불러오기
import pandas as pd
# pandas 라이브러리를 불러올 것이며 이제부터 pandas를 pd라고 부를게 !
# 에러날 경우 !pip install pandas #실행

# pd.read_excel('파일경로/파일명.확장자')
# 엑셀 불러오기
pd.read_excel('./파일명.xlsx') # ./ ==> 현재 내가 있는 위치라는 의미
# csv 파일 불러오기
pd.read_csv('./파일명.xlsx')
-기본 인덱스:
기본적으로 0부터 시작하는 정수 인덱스를 제공
import pandas as pd
# 기본 정수 인덱스를 가진 데이터프레임 생성
df = pd.DataFrame({'A': [1, 2, 3], 'B': ['a', 'b', 'c']})
-사용자 지정 인덱스:
# 사용자가 직접 인덱스를 설정한 데이터프레임 생성
df = pd.DataFrame({'A': [1, 2, 3], 'B': ['a', 'b', 'c']}, index=['idx1', 'idx2', 'idx3'])
-활용
1. 데이터에 접근하거나 조작
# 특정 인덱스의 행에 접근
row = df.loc['idx2']
# 인덱스를 기준으로 데이터프레임 정렬
sorted_df = df.sort_index()
2.set_index() → 특정 컬럼에 들어있는 값을 인덱스로 활용.
# df가 가지고 있는 특정 컬럼명을 기준으로 인덱스를 설정하기
data = df.set_index('컬럼명')
data.head()
# 불러올때 인덱스 지정하기
pd.read_csv('./data/file.csv' , index_col = '컬럼정보')
pd.read_csv('./data/file.csv' , index_col = 0) # 0부터 시작
3.데이터프레임.index를 통해 인덱스를 확인 가능
#인덱스 확인하기
data.index
#리스트 형태를 활용해서 인덱스를 새로 입력할 수 있습니다.
data.index = ['1번' , '2번' , '3번']
data
4.reset_index() 를 활용해서 현재 인덱스를 0부터 시작하는 정수로 변경
# reset_index() 의 기본 값은 drop = False 를 가지고 있습니다.
data.reset_index()
# 현재 인덱스를 컬럼으로 변경할 수 있습니다.
# reset_index(drop = True) 명령어를 활용하면,
# 현재 인덱스 값을 컬럼으로 변경하지 않고 인덱스를 초기화할 수 있습니다
data.reset_index(drop=True)
-예시
import pandas as pd
# 데이터프레임 생성
data = {
'이름': ['Alice', 'Bob', 'Charlie'],
'나이': [25, 30, 35],
'성별': ['여', '남', '남']
}
df = pd.DataFrame(data)
1.
# 각 컬럼 출력
print(df['이름']) # '이름' 컬럼 출력
print(df['나이']) # '나이' 컬럼 출력
print(df['성별']) # '성별' 컬럼 출력
#'이름', '나이', '성별'은 데이터프레임의 각 컬럼
2. 컬럼명 변경하기
#names = [’컬럼명1’ , ‘컬럼명2’ , … , ‘컬럼명 19’]
pd.read_csv('./data/file.csv' , names = [’컬럼명1’, ‘컬럼명2’, … ,‘컬럼명 19’])
3.데이터프레임.column을 통해 컬럼을 확인
#컬럼 확인하기
data.column
#리스트 형태를 활용해서 컬럼명을 새롭게 입력할 수 있습니다.
data.column = ['축구', '농구', '배구', '야구']
data
df = 데이터프레임 # 저장하고 싶은 데이터
df.to_csv('./newfile.csv', index = False)
data.head() # head()은 기본 5개 행에 대한 데이터를 보여줌
data.head(3) # ()안에 숫자만큼 데이터를 보여줌
#tail은 뒤에서 5개!
data.info()
# null 값을 확인할때도 활용
data.describe()
# 숫자값에 대해서만 기초통계량 확인이 가능합니다.
# 결측치 확인 : isnull()
df.isnull().sum() # 이렇게하면 결측치가 몇개있는지도 알 수 있어요 !
# 결측치 제거 : dropna()
df.dropna()
2)데이터 중복 데이터는 없는지?
# 중복 데이터 확인
df.duplicated(subset=['컬럼1', '컬럼2', '컬럼3'])
# 중복 데이터 제거
df.drop_duplicates(subset=['컬럼1', '컬럼2', '컬럼3'])
3)데이터 이상치는 없는지?
# IQR (Interquartile Range) 방법 찾아보기
# 참고 : https://www.scribbr.com/statistics/interquartile-range/
# IQR 계산
Q1 = df['컬럼1'].quantile(0.25)
Q3 = df['컬럼1'].quantile(0.75)
IQR = Q3 - Q1
# 이상치 기준 설정
lower_bound = Q1 - 1.5 * IQR
upper_bound = Q3 + 1.5 * IQR
# 이상치 제거
df[(df['컬럼1'] >= lower_bound) & (df['컬럼1'] <= upper_bound)]
4)데이터 타입을 알맞게 들어가있는지? ex) 날짜, 숫자
# 데이터 타입 변경을 원한다면 !
df['column_name'].astype(int)
df['column_name'].astype(float)
df['column_name'].astype(str)
df['column_name'].astype(bool)
df['column_name'].astype('category')
df['column_name'].astype('datetime64[ns]')
df['column_name'].astype(complex)
df['column_name'].astype(object)

astype() 는 Pandas 데이터프레임의 열의 데이터 타입을 변경하는 데 사용.DataFrame['column_name'] = DataFrame['column_name'].astype(new_dtype)
#DataFrame['column_name']: 열을 선택하는 방식으로 열의 데이터 타입을 변경하고자 하는 열을 지정.
#new_dtype: 변경하고자 하는 새로운 데이터 타입을 명시. (예: 'int', 'float', 'str' 등)
# int → float
import pandas as pd
# 예시 데이터프레임 생성
data = {'integer_column': [1, 2, 3, 4, 5]}
df = pd.DataFrame(data)
# 정수형 열을 부동소수점으로 변환
df['integer_column'] = df['integer_column'].astype(float)
print(df.dtypes) # 데이터프레임의 열 타입 확인
# int → str
import pandas as pd
# 예시 데이터프레임 생성
data = {'numeric_column': [1, 2, 3, 4, 5]}
df = pd.DataFrame(data)
# 숫자열을 문자열로 변환
df['numeric_column'] = df['numeric_column'].astype(str)
print(df.dtypes) # 데이터프레임의 열 타입 확인
data.iloc[0,2]
#행과 열 번호를 통해 특정 데이터를 선택할 수 있음
--------------------------------------------------------
import pandas as pd
# 샘플 데이터프레임 생성
data = {
'A': [1, 2, 3, 4, 5],
'B': [10, 20, 30, 40, 50],
'C': [100, 200, 300, 400, 500]
}
df = pd.DataFrame(data)
# iloc을 사용하여 특정 행과 열 선택
selected_data = df.iloc[1:4, 0:2] # 인덱스 1부터 3까지의 행과 0부터 1까지의 열 선택
print(selected_data)
-.loc[로우,컬럼] : 이름으로 선택하기
:인덱스가 번호가 아니고 특정 문자일 경우
data.loc['행이름' , '컬럼명']
# 행이름과 컬럼명을 통해서도 특정 데이터를 선택할 수 있음
--------------------------------------------------------
import pandas as pd
# 샘플 데이터프레임 생성
data = {
'A': [1, 2, 3, 4, 5],
'B': [10, 20, 30, 40, 50],
'C': [100, 200, 300, 400, 500]
}
df = pd.DataFrame(data, index=['a', 'b', 'c', 'd', 'e'])
# loc을 사용하여 특정 행과 열 선택
selected_data = df.loc['b':'d', 'A':'B'] # 레이블 'b'부터 'd'까지의 행과 'A'부터 'B'까지의 열 선택
print(selected_data)
*가장 큰 차이점!
python의 인덱스는 '0'부터 시작이고, 슬라이싱을 할때 마지막은 포함하지 않는다!
하지만! loc의 경우 마지막도 포함이라는 것을 기억하자.
즉, .iloc[1:5 , :6]: 행 1~4, 열0~5이지만,
.loc['a':'r']:행 a~r까지 조회한다.
#리스트 슬라이싱을 활용
data.loc[: , '컬럼명']
#또는 데이터프레임['컬럼명'] 으로도 동일한 값을 선택할 수 있습니다.
data['컬럼명']
#여러개
data[ ['컬럼명1', '컬럼명2', '컬럼명3' ] ]
#순서바꾸기
data[ ['컬럼명3', '컬럼명1', '컬럼명2' ] ]
-2개 이상의 셀을 선택할 경우
# 2개 컬럼명을 선택할 경우
data.loc[ '행이름' , ['컬럼명1' , '컬럼명2'] ]
# 2개 행이름을 선택할 경우
data.loc[ ['행이름1', '행이름2'] , '컬럼명1' ]
# 리스트 슬라이싱 : 을 활용해서 특정 범위를 지정하여 선택할 수 있습니다.
data.loc[ '행이름' , '컬럼명1' : ] # '컬럼명1' : ==> 컬럼명1부터 끝까지라는 의미
-예시
1)단일 조건으로 필터링:
특정 열의 값을 기준으로 조건을 설정하여 해당 조건을 만족하는 행을 선택
# 'age' 열에서 30세 이상인 행 필터링
df[df['age'] >= 30]
2)여러 조건으로 필터링:
# 'age' 열에서 30세 이상이면서 'gender' 열이 'Male'인 행 필터링
df[(df['age'] >= 30) & (df['gender'] == 'Male')]
3)조건에 따른 특정 컬럼 필터링:
# 'age' 열에서 30세 이상인 경우의 'name' 열만 선택
df.loc[df['age'] >= 30, 'name']
4)isin()을 활용한 필터링:
# 'gender' 열에서 'Male' 또는 'Female'인 행 필터링
df[df['gender'].isin(['Male', 'Female'])]
*isin() 매소드란?
Series(시리즈)나 DataFrame(데이터프레임)의 값들 중에서 특정 값이나 리스트 안에 포함된 값들을 찾아내는 메소드. 원하는 조건에 해당하는 데이터를 빠르게 필터링하거나 선택할 수 있음
#단일 값 포함 여부 확인
# Series나 DataFrame의 특정 열에서 단일 값이 포함되어 있는지 여부를 확인합니다.
import pandas as pd
data = {'A': [1, 2, 3, 4, 5],
'B': ['apple', 'banana', 'orange', 'grape', 'melon']}
df = pd.DataFrame(data)
# 'B' 열에서 'banana' 값이 있는지 확인
result = df['B'].isin(['banana'])
print(result)
#여러 값 포함 여부 확인
# 여러 값이 포함된 데이터를 찾기 위해 리스트에 여러 값을 넣어 사용합니다.
# 'A' 열에서 2 또는 4 값을 포함하는 행 찾기
result = df['A'].isin([2, 4])
print(result)
#데이터프레임 전체에서의 사용
# 데이터프레임 전체에서 여러 열에 대해 isin()을 사용할 수 있습니다.
# 데이터프레임 전체에서 여러 조건을 확인하여 필터링
result = df.isin({'A': [1, 3], 'B': ['apple', 'orange']})
print(result)
-여러개 조건을 활용해서 값을 불러오기.
# 조건1 and 조건2 ==>> 조건1,2 둘다 만족해야한다 True
## and 를 &로 대체해서 사용할 수 있음
condition1 = data['컬럼명1'] < 80
condition2 = data['컬럼명2'] >= 50
condition = condition1 & condition2
data[conditon]
# 조건1 or 조건2 ==>> 조건1과 조건2 둘중 하나만 만족하면 True
## or 를 |로 대체해서 사용가능
condition1 = data['컬럼명1'] < 80
condition2 = data['컬럼명2'] >= 50
condition = condition1 | condition2
data[conditon]
# ()로 구분해서 조건을 한번에 입력해도 동일하게 활용할 수 있습니다.
condition = (data['컬럼명1'] < 80) & (data['컬럼명2'] >= 50)
data[conditon]
# 이렇게도 가능합니다.
data[(data['컬럼명1'] < 80) & (data['컬럼명2'] >= 50)]
# 조건이 많아서 행이 길어질 경우, 줄바꿈을 통해 구분해주시면 훨씬 가독성이 올라갑니다.
condition = (data['컬럼명1'] < 80) \
& (data['컬럼명2'] >= 50)\
& (data['컬럼명3'] >= 10)
data[conditon]
df = pd.DataFrame()
df['컬럼명'] = data
# df라는 데이터프레임에 '컬럼명'이라는 이름의 컬럼이 추가되고,해당 컬럼에 data라는 값이 추가된다.
# 이때, data값이 1개의 단일 값인 경우에는 전체 df라는 데이터프레임 행에 data 값이 전체 적용됨
# 즉,
# 하나의 값인 경우 => 전체 모두 동일한 값 적용
# (리스트,시리즈)의 형태인 경우 => 각 순서에 맞게 컬럼 값에 적용됨
-신규 컬럼 추가하기
df = pd.DataFrame()
# 컬럼 추가하기
df['EPL'] = 100
df['MLS'] = 60
df['NBA'] = 70
df
# 리스트 형태로 컬럼값 추가하기
df['KFC'] = [50, 10, 30]
#Tip. 행 수를 맞춰서 입력해줘야함
# 컬럼을 여러 조건 및 계산식을 통해 산출 값으로도 추가가 가능
df['ABC'] = (df['EPL'] + df['NBA']) * df['MLS'] * 2
axis: 연결하고자 하는 축(방향)을 지정.ignore_index: 기본값은 False이며, 연결된 결과 데이터프레임의 인덱스를 유지. True로 설정하면 새로운 인덱스를 생성. (True → 기존 인덱스를 무시하고 새롭게 인덱스를 설정)
import pandas as pd
# 두 개의 데이터프레임 생성
df1 = pd.DataFrame({'A': ['A0', 'A1', 'A2'], 'B': ['B0', 'B1', 'B2']})
df2 = pd.DataFrame({'A': ['A3', 'A4', 'A5'], 'B': ['B3', 'B4', 'B5']})
# 위아래로 데이터프레임 연결
result_vertical = pd.concat([df1, df2], axis=0)
# 좌우로 데이터프레임 연결
result_horizontal = pd.concat([df1, df2], axis=1)
print("위아래 연결 결과:\n", result_vertical)
print("\n좌우 연결 결과:\n", result_horizontal)
left와 right: 병합할 데이터프레임 중 병합되는 기준이 되는 왼쪽(left)과 오른쪽(right) 데이터프레임.how(조인방법): 병합 방법을 나타내는 매개변수로, 'inner', 'outer', 'left', 'right' 등의 옵션이 있다.on(기준 컬럼): 병합 기준이 되는 열 이름(혹은 열 이름의 리스트)을 지정.left_on과 right_on: 왼쪽 데이터프레임과 오른쪽 데이터프레임에서 병합할 열 이름이 다른 경우에 사용.```pythonimport pandas as pd#두 개의 데이터프레임 생성
left_df = pd.DataFrame({'key': ['A', 'B', 'C', 'D'], 'value': [1, 2, 3, 4]})
right_df = pd.DataFrame({'key': ['B', 'D', 'E', 'F'], 'value': [5, 6, 7, 8]})
#'key' 열을 기준으로 두 데이터프레임 병합
merged_df = pd.merge(left_df, right_df, on='key', how='inner')
print(merged_df)
7. 데이터 집계
- Group by
```python
import pandas as pd
#샘플 데이터프레임 생성
data = {
'Category': ['A', 'B', 'A', 'B', 'A', 'B'],
'Value': [1, 2, 3, 4, 5, 6]
}
df = pd.DataFrame(data)
#'Category' 열을 기준으로 그룹화하여 'Value'의 연산 수행
grouped = df.groupby('Category').mean()
grouped_sum = df.groupby('Category').sum()
grouped_count = df.groupby('Category').count()
grouped_max = df.groupby('Category').max()
grouped_min = df.groupby('Category').min()
#수치형 데이터의 경우에 연산이 가능
-복수의 열을 기준으로 Group by 함수 사용하기
import pandas as pd
#샘플 데이터프레임 생성
data = {
'Category': ['A', 'A', 'B', 'B', 'A', 'B'],
'SubCategory': ['X', 'Y', 'X', 'Y', 'X', 'Y'],
'Value': [1, 2, 3, 4, 5, 6]
}
df = pd.DataFrame(data)
#'Category'와 'SubCategory' 열을 기준으로 그룹화하여 'Value'의 합 계산
grouped_multiple = df.groupby(['Category', 'SubCategory']).sum()
print(grouped_multiple)
-다양한 집계 함수 적용
import pandas as pd
#샘플 데이터프레임 생성
data = {
'Category': ['A', 'A', 'B', 'B', 'A', 'B'],
'SubCategory': ['X', 'Y', 'X', 'Y', 'X', 'Y'],
'Value1': [1, 2, 3, 4, 5, 6],
'Value2': [10, 20, 30, 40, 50, 60]
}
df = pd.DataFrame(data)
#'Category'와 'SubCategory' 열을 기준으로 그룹화하여 각 그룹별 'Value1'과 'Value2'의 평균, 합 계산
grouped_multiple = df.groupby(['Category', 'SubCategory']).agg({'Value1': ['mean', 'sum'], 'Value2': 'sum'})
print(grouped_multiple)
*agg() 함수를 사용하여 여러 열에 대해 다양한 집계 함수를 적용
import pandas as pd
#샘플 데이터프레임 생성
data = {
'Date': ['2023-01-01', '2023-01-01', '2023-01-02', '2023-01-02', '2023-01-01'],
'Category': ['A', 'B', 'A', 'B', 'A'],
'Value': [10, 20, 30, 40, 50]
}
df = pd.DataFrame(data)
#피벗 테이블 생성: 날짜를 행 인덱스로, 카테고리를 열 인덱스로, 값은 'Value'의 합으로 집계
pivot = df.pivot_table(index='Date', columns='Category', values='Value', aggfunc='sum')
print(pivot)
-여러 열을 기준으로 피벗 테이블 생성하기
import pandas as pd
#샘플 데이터프레임 생성
data = {
'Date': ['2023-01-01', '2023-01-01', '2023-01-02', '2023-01-02', '2023-01-01'],
'Category': ['A', 'B', 'A', 'B', 'A'],
'SubCategory': ['X', 'Y', 'X', 'Y', 'X'],
'Value': [10, 20, 30, 40, 50]
}
df = pd.DataFrame(data)
#피벗 테이블 생성: 'Date'를 행 인덱스로, 'Category'와 'SubCategory'를 열 인덱스로, 값은 'Value'의 합으로 집계
pivot = df.pivot_table(index='Date', columns=['Category', 'SubCategory'], values='Value', aggfunc='sum')
print(pivot)
-집계 함수를 다르게 적용하여 피벗 테이블 생성하기
import pandas as pd
#샘플 데이터프레임 생성
data = {
'Date': ['2023-01-01', '2023-01-01', '2023-01-02', '2023-01-02', '2023-01-01'],
'Category': ['A', 'B', 'A', 'B', 'A'],
'Value1': [10, 20, 30, 40, 50],
'Value2': [100, 200, 300, 400, 500]
}
df = pd.DataFrame(data)
#피벗 테이블 생성: 'Date'를 행 인덱스로, 'Category'를 열 인덱스로, 값은 'Value1'과 'Value2'의 평균과 합으로 집계
pivot = df.pivot_table(index='Date', columns='Category', values=['Value1', 'Value2'], aggfunc={'Value1': 'mean', 'Value2': 'sum'})
print(pivot)
import pandas as pd
#샘플 데이터프레임 생성
data = {
'Name': ['Alice', 'Bob', 'Charlie', 'David', 'Eva'],
'Age': [25, 22, 30, 18, 27],
'Score': [85, 90, 75, 80, 95]
}
df = pd.DataFrame(data)
#정렬
sorted_by_score = df.sort_values('Score') # 'Score' 열을 기준으로 오름차순 정렬
sorted_by_score = df.sort_values('Score',ascending=False) # 'Score' 열을 기준으로 내림차순 정렬
print(sorted_by_score)
-sort_index() 함수:
인덱스를 기준으로 정렬
import pandas as pd
#샘플 데이터프레임 생성
data = {
'Name': ['Alice', 'Bob', 'Charlie', 'David', 'Eva'],
'Age': [25, 22, 30, 18, 27],
'Score': [85, 90, 75, 80, 95]
}
df = pd.DataFrame(data)
#정렬
sorted_by_index = df.sort_index() # 인덱스를 기준으로 오름차순 정렬
sorted_by_index = df.sort_index(ascending=False) # 인덱스를 기준으로 내림차순 정렬
print(sorted_by_index)
key point
아직 익숙하지 않고, 내용이 많아서 모든 내용을 숙지한건 아니지만, 그래도 sql의 문법과 유사한 면들이 보여서 이해하는 것이 어렵지는 않았던것 같다. 다만, 메소드와 함수의 차이가 있고 이를 구분하고 상황에 맞게 사용하는것, []구분하는 것등은 아직 익숙하지 않기때문에 실습과 복습을 통해 익히는 과정이 중요할 것 같다.