AI 부트 캠프 - 4일차

Cookie Baking·2024년 10월 4일

AI 부트 캠프 TIL

목록 보기
4/42

1. 판다스에서 데이터 읽기

pd.read_csv("읽을 CSV 파일")

  • 파일이 아닌 URL로부터 직접 바로 다운로드해서 가져올 수도 있음 : pd.read_csv("URL")

pd.read_excel("읽을 EXCEL 파일")

  • 특정 sheet를 읽고 싶다면? .head(읽고 싶은 sheet의 번호를 지정해둠)

pd.read_json("읽을 JSON 파일")

  • 하지만 json 파일이라면 테이블 형식이 아니기 때문에 데이터 가공 처리 작업이 필요할 수도 있음

데이터프레임.head()

  • 데이터프레임을 간단히 확인하고 싶을 때 사용함

데이터프레임.tail(n)

  • 데이터프레임을 뒤에서부터 확인하고 싶을 때 사용함
  • 뒤에서부터의 n번까지의 데이터프레임을 갖고옴 (0부터 아님 주의)

데이터프레임.sample(n)

  • 데이터프레임에서 무작위로 괄호 안에 수만큼 가져옴

데이터프레임.info()

  • 데이터프레임의 기본 정보를 가져옴
  • 결측치를 확인할 수 있으며 만일 결측치가 object 형태라면 적절한 데이터 변환이 불가능함

데이터프레임.dtypes()

  • 데이터프레임의 열 type 정보 가져옴

데이터프레임.describe()

  • 평균, 표준편차, 최댓값, 최솟값, 사분위 수까지 보여줌

데이터프레임.columns

  • 열 가져옴
  • 행을 보고 싶다면 슬라이싱으로 지정해줘야 함

주요 옵션

  • sep : 구분자를 지정함 / 기본값은 "."임
    - read_csv와 함께 특정 구분자가 지정되어 있다면 정의할 수 있겠음
    - 탭으로 구분하고 구분하고 싶다면 ? -> sep = "\t"
  • header : 헤더 행을 지정함
    - read_csv의 옵션값으로 지정될 수 있겠음
    - 기본값은 첫 번째 행(0)임
  • df[특정 열 number] 로 특정 칼럼 접근 가능
  • index는 문맥에 따라 달라짐 (RangeIndex는 인덱스를 효율적으로 관리할 수 있도록 설계되어 있음)
  • Panda에서의 논리 연산자는 and / or / not (Python의 기본 연산자)를 사용할 수가 없음 -> $ | ~ 을 사용해야 함
  • 특정 열의 값들만 가져오고 싶다면 ? -> 데이터프레임.loc[:, "certain_column"]

데이터 프레임의 개별 데이터 확인하기

  • loc[]로 행과 열의 위치를 지정하여 접근하기
  • 라벨[인덱스, 칼럼명]을 사용해 특정 데이터를 조회함
  • iloc[]로 행과 열의 위치 인덱스를 사용해 접근하기
  • iloc[]은 정수 인덱스를 사용해 데이터를 조회함
  • loc[]과 iloc[]의 차이점은 loc은 라벨을, iloc은 정수를 사용함
    - iloc[]은 절대주소, loc[]은 상대주소
  • iloc[]은 뒤가 포함이 되지 않는 반면 loc[]은 뒤가 포함됨
  • loc[행선택, 열선택]
  • iloc[]을 사용하고 싶다면?
    - slicing할 때 유의해야 함 df.iloc[[0:2], [1:2]]가 아닌 df.iloc[0:2, [1:2]]를 해주어야 함

df.loc[0] # 첫 번째 행
df.loc[0, '이름'] # 첫 번째 행의 '이름' 열 데이터

df.iloc[0] # 첫 번째 행
df.iloc[0, 1] # 첫번 째 행의 두 번째 열 데이터

Ex.

data = {'Name' : ['Alice', 'Bob', 'Christa'],
       'Age' : [3, 10, 2],
       'City' : ['New York', 'Seoul', 'Dockyo']}

df_3 = pd.DataFrame(data)
  • 특정 행 전체를 선택하려면 loc[] 또는 iloc[]을 사용함
    - result = df_3.loc[df_3['Name'] == 'Alice', ['Age', 'City']]
    • result = df_3.iloc[0, [1, 2]]
  • 만약 여러 열을 선택하고 싶다면? -> 데이터프레임[]을 사용함
    - df_3[["Name", "City"]]

인덱스를 사용한 데이터 선택

  • 데이터프레임에서 인덱스는 각 행을 고유하게 식별할 수 있는 라벨임
  • 인덱스를 사용해 특정 행이나 그룹을 쉽게 선택할 수 있음
  • set_index("index_name") # 특정 열로 인덱스를 설정

조건부 필터링
isin() 을 사용한 필터링 : 특정 값들이 포함된 행을 필터링할 때 유용함


# 직업이 '학생' 또는 '프리랜서'인 행 선택
filtered_df = df[df['직업'].isin(['학생', '프리랜서'])]

-> 즉 데이터프레임의 특정 열의 값이 isin()의 괄호 안에 들어가는 값들에 걸리는 지 확인할 수 있다. 

astype()을 사용한 데이터 타입 변환
df["변환할 컬럼"] = df["변환할 컬럼"].astype(변환할 type)

  • 결측치가 있다면?! -> filna() 메서드 이용해 채워넣기
  • df["변환할 컬럼"].filna(df["변환할 컬럼"].mean(), inplace=True)
    - # inplace는 원본을 바꾸려는 값임
  • ENUM 타입 처럼 반복적인 값이라면 ?
    category화 해주자 : astypes('category')
  • 날짜 타입으로 변환
data = {
	"이름" : ["철수", "영희", "민수"],
    "가입일" : ["2024-10-04", "2024-10-03", "2024-10-02"]
}

df["가입일] = pd.to_datatime(df["가입일"])

데이터 정렬
데이터프레임.sort_values(by="정렬하고자하는 컬럼", ascending=False)

  • 값 기준으로 데이터프레임을 정렬하고 싶다면 사용
  • 기본값은 오름차순
  • ascending 옵션을 주게 되면 내림차순 정렬이 됨

데이터프레임.sort_index()

  • 인덱스를 기준으로 데이터를 정렬할 수 있음
  • 열이름이 인덱스라면? -> by="열이름"

데이터 병합

merge를 사용한 데이터프레임 병합

  • SQL의 JOIN과 유사하게 두 데이터프레임을 공통 열을 기준으로 병합함
df1 = pd.DataFrame({
	"이름" : ["철수", "영희", "민수"],
    "나이" : [25, 30, 22]
})

df2 = pd.DataFrame({
	"이름" : ["철수", "영희", "지수"],
    "직업" : ["학생", "회사원", "프리랜서"]
})

merged_df = pd.merge(df1, df2, on="이름") 
# inner JOIN이기 때문에 특정 값이 없다면 삭제해버림 
# how 값을 명시해줘서 어떤 JOIN을 할 것인지 표시할 수 있음 (left, outer)
# 공통값이 없다면 NaN으로 채움
print(merged_df)

join()을 사용한 데이터프레임 병합

  • 인덱스를 기준으로 데이터프레임을 병합할 때 사용함
df3 = pd.DataFrame({
	"직업" : ["학생", "회사원", "프리랜서"],
    "연봉" : [2000, 3000, 4000]
}, index = ["철수", "영희", "지수"])

joined_df = df3.set_index("이름").join(df3)
print(joined_df)

데이터프레임 연결 (concat)

pd.concat([연결할 열들],axis=0)

  • axis=0 : 행 단위로 연결, axis=1 : 열 단위로 연결

데이터 그룹화 및 집계

  • groupby() : 중복되는 값들을 묶음
  • agg() : 특정 계산 방법을 적용하려면

2. 판다스에서 데이터 저장하기

pd.to_csv("저장할 파일 이름", index=False)

  • index=False : 인덱스를 제외하고 저장함
  • sep : 구분자를 지정하고 싶다면 지정 (기본값은 "."임)

데이터베스에 저장하기

import sqlite3

conn = sqlite3.connect("database.db")

df.to_sql('table_name', conn, if_exists='replace', index=False)

conn,close()

///
name : 저장할 테이블 이름 지정
conn : 데이터베이스 연결 객체를 지정
if_exists : 테이블이 이미 존재할 경우 동작을 지정 
idex: 인덱스를 제외하고 지정

데이터 변형

data = {
	"이름" : ["철수", "영희", "원수", "지수", "철수", "영희"],
    "과목" : ["수학", "영어", "국어", "지구과학", "물리", "화학"],
    "점수" : [90, 80, 79, 89, 90, 12]
}

df = pd.DataFrame(data)

grouped = df.groupby("이름") # 이름이 같은 것끼리 묶임

# 여러 집계함수를 동시에 사용하고 싶다면? -> agg 사용
agg_scores = grouped['점수'].agg(["sum", "mean"])

피벗테이블

  • 데이터를 요약하고, 특정 기준에 따라 재구조화함

pivet_table() 사용법

  • pivet_table() 함수는 데이터를 요약하고, 특정 기준에 따라 재구조화함

pd.pivot_table(df, index="이름", columns="과목", values="점수", aggfunc="mean")

  • 옵션
  • index : 세로축으로 나오게 될 index
  • columns : 가로축으로 나오게 될 index
  • aggfunc : 계산 방법, 배열로 계산하고 싶은 방법을 적어줄 수 있겠음
    mean : 평균
    sum : 합계
    min : 최소값
    max : 최대값
  • margins : 합계를 추가하고 싶다면 True
  • fill_values : Nan값을 다른 것으로 채우고 싶을 때

0개의 댓글