[1. Pandas]
1.pandas 소개
- 구조적 데이터의 표현과 처리에 적합함
- 다양한 포멧으로 저장된 데이터 접근 및 효율적인 분석/ 처리 가능
- CSV, Excel, RDB 등 다양한 입력 형식 지원
- 데이터 입력 및 출력 용이
- 데이터 가공과 필터링, 그룹화
- 통계 및 데이터 분석과 시각화 지원
- pandas 설치 및 사용
- Colab에는 기본 설치되어 있음
- import pandas as pd
- 예시: pd.Series([1,3,5,12])
2.pandas 의 데이터 타입
- 시리즈(Series): 1차원 데이터 구조, 1차원 라인 그래프 형태로 데이터를 시각화 가능
- 데이터프레임(DataFrame): 2차원 데이터 구조, 표 형태로 나타
- 패널(Panel): 3차원 데이터 구조 (현재는 거의 사용되지 않음)
- 4차원 이상의 데이터: Panel4D, NA값을 포함한 데이터: PanelNDE 등 실험적으로 사용됨

[2. Pandas_Series]
1.pandas 의 Series 란?
- 1차원 데이터를 저장하기 위한 데이터 구조
- 마치 리스트나 배열처럼 동작하지만, 인덱스를 지정할 수 있다는 점이 특징
(리스트는 자동으로 0,1,2~의 인덱스가 지정되지만, Series는 원하는 값으로 인덱스를 지정가능-문자도 가능!)
(** 배열 : 같은 종류의 데이터를 순서대로 저장하는 데이터 구조
** 리스트 : 여러 자료형을 섞을수 있음) - 시리즈는 pd.Series() 함수로 생성
- 각 요소에 인덱스를 부여하며, 인덱스는 기본적으로 0부터 시작하지만, 직접 지정도 가능
2. Series의 특징
- 데이터 타입 제한 없음
- 숫자, 문자열, NaN 등 다양한 데이터 타입을 혼합하여 담을 수 있음
- 내부적으로는 Numpy의 ndarray 형태로 저장됨
(Series는 인덱스와 값이 있는 표처럼 생겼지만, 실제 데이터를 담고 있는 구조는 numpy의 배열(ndarray)임!) - dtype을 통해 데이터 타입 확인 가능

3. 라인 레이블(인덱스) 지정 방법
- 인덱스는 정수형, 문자형 등 다양한 형태로 지정 가능하며 중복이 있어도 상관없음 (단, 혼동될 수 있으니 주의 필요)
- 라인 레이블은 1씩 증가할 필요가 없으며 단조 증가할 필요가 없다.
- 인덱스의 길이와 값의 개수가 일치하면 사용 가능
ex) pd.Series([1,2,3], index=['a','b','c'])
- 딕셔너리 타입 리터럴을 인자로 넘길 수 있음

4. 라인 레이블(인덱스) 값 접근
- 처음생성할때에는 0,1,2,3`` 처럼 인덱스가 자동으로 부여된다.

- dat.index = [...] 로 인덱스를 한 번에 바꿔줄 수도 있다. (데이터는 그대로 유지하며, 레이블만변경)

- loc[ ] : 레이블 인덱스에 의한 데이터 접근 (레이블이름으로 해당 레이블의 값을 반환)

- iloc[ ] : 순서 인덱스를 이용한 접근 (정수위치 기반 접근방식)
>> 0부터 시작함
>> 중복된 레이블이 있는경우에도 문제없이 원하는 데이터에 접근이 가능

4. 계층형 인덱스 (값이 아니고 인덱스를 2개 이상으로!!!!)
- 인덱스를 다중단계로 설정하여 축에 대해 다중 (둘 이상) 색인단계를 지정할 수 있도록 해준다.
- 고차원 데이터를 저차원 형식으로 다룰 수 있게 해준다.
>> panel이나 panel4D와 같은 데이터 타입을 사용하지 않고 Series 혹은 DataFrame으로 고차원데이터 표현 가능 - 복잡한 데이터를 구조화해서 저장이 가능하며 패널데이터, 시계열, 그룹분석등에 매우 유용하다.

[3. Pandas_DataFrame]
1.pandas 의 DataFrame 이란?
- 2차원 데이터 구조로 Pandas에서 가장 많이 사용되는 데이터 타입
>> 로우 레이블(index)와 칼럼 테이블(columns)을 지정할 수 있음 - Series가 1차원(열 하나짜리 표)이라면, DataFrame은 여러 Series가 모인 2차원 표인 것
- 스프레드시트(엑셀) 혹은 SQL 테이블과 유사한 모습
- 다양한 데이터 타입 저장가능
>> 딕셔너리 타입 : 리스트 / 튜플 / 시퀀스 타입 / 시리즈 / 딕셔너리를 값으로 갖는 것
>> 리스트 : 딕셔너리, 시리즈, 리스트, 튜플을 요소로 갖는 리스트
>> 데이터프레임 : 데이터프레임에 얕은 복사로 사본이 생성
>> NumPy의 2차원 ndarray : 데이터프레임은 2차원 이므로 2차원 배열을 데이터프레임으로 변환 가능 - 구조 :

2. 다양한 형식에서 DataFrame 생성하기
- 딕셔너리 → DataFrame
>> 버전에 따라 자동정렬로 인해 순서가 바뀔 수 있으므로 처음 생성 시 인자에서의 순서와 달라질수 있으므로 주의!

>> 칼럼순서를 명시하고 싶을경우 columns 인자를 사용하여
columns=["성별", "이름", "나이"]처럼 순서를 명시적으로 지정하면 사용가능!

>> 단, columns인자를 사용해 명시된 칼럼이 데이터프레임에 없을경우, NaN반환!


- Numpy 2차원 배열 → DataFrame

- DataFrame → Series : 데이터프레임의 한 칼럼을 시리즈로 변환
>> s1 = 데이터프레임객체.칼럼명 : 공백,한글,특수문자,파이썬예약어일 경우 사용불가
>> s2 = 데이터프레임객체['칼럼명'] : 한글, 공백, 특수문자 모두 ok

3. 칼럼 지정 방법
- colums 인자를 사용해 생성시 지정하는 방법

- .colums 속성을 사용하여 나중에 이름 바꾸는 방법 (초기에 미설정시 0부터 숫자로 자동설정된다.)

4. DataFrame의 계층형 인덱스
- 인덱스 또는 칼럼에 2단계 이상의 구조를 부여할 수 있는 기능
- 일반적인 인덱스 / 칼럼은 단일 이름이지만, 계층형 인덱스는 튜플 형태로 되어 있음
- Series에서도 쓸 수 있지만, DataFrame에서는 행과 열 모두 계층형으로 만들 수 있음


- 계층형인덱스 접근방법
>> frame.loc[('a', 1)] : ('a', 1)이라는 인덱스에 해당하는 행 전체를 가져옴
>> frame['Ohio']['Green'] : "Ohio"라는 1단계 컬럼 전체를 가져온 후 "Green"이라는 칼럼 가지고옴

5. DataFrame의 사칙연산
- Series와 DataFrame 객체끼리는 * + - / 등의 사칙연산이 가능
- 연산시 인덱스와 칼럼이름을 기준으로 정렬 후 연산
- 서로 크기가 달라도 연산이 가능하지만, 일치하지 않는 부분은 NaN (결측값) 반환
>> Series 간의 사칙연산

>> DataFrame 간의 사칙연산

[4. 데이터 선택하기]
1.기본정보 확인하는 함수

2. 인덱스를 이용한 행 선택 (iloc = 숫자기반, loc = 라벨기반)
- 정수 위치 기반 ".iloc[ ]"
>> df.iloc[0] : 첫번째 행
>> df.iloc[0:3] : 0~2번째 행 슬라이싱 - 레이블(이름)기반 ".loc[ ]"
>> df.loc["서울"] : "서울"이라는 행
>> df.loc[["행이름1":"행이름3"]] : 여러 행 선택
3. 열 선택 (iloc, loc은 행을 선택할때 쓰는거임! 열 선택할땐 쓰지 않는다.)
- 단일 열 선택 (Series변환)
>> df [ "열이름" ] - 여러 열 선택 (DataFrame 변환)
>> df [ [ "열이름1" , "열이름2" ] ]
★df [ "열" ] 과 df [ ["열"] ]은 반환 타입이 다르다. (앞은 Series 반환, 뒤는 DataFrame 반환)
★ df.iloc[1, 3] : 두번째 행, 4번째 열을 가져오라는 의미 (0부터시작)
★df.iloc[[1, 3]]) : 1행과 3행 와 모든 열을 가져옴
★df.iloc[:, [1, 3]] : 모든행에서 1열과 3열만 가져옴
★단, 슬라이싱 문법은 리스트안에 넣으면 파이썬이 인식을 못함
=> df.iloc[[1:3]], df.iloc[:,[1:3]] 불가
=> df.iloc [ 1:3, 0:2] 는 가능! (행 : 2~3행/ 열: 1~2열 // 0부터 시작)
=> df.iloc[:, 1:4]는 가능! (행:전)체 / 열 : 2열~4열 // 0부터 시작)
4. 행과 열을 동시에 선택
- df.loc["서울", "여름"] # 서울 행의 여름 열 값
- f.loc["서울", ["봄", "가을"]] # 서울 행의 일부 열
- df.loc[["서울", "부산"], ["봄", "여름"]] # 여러 행, 여러 열 (반드시 리스트안에 담아주기 안그러면 튜플로 인식하여 에러!)

5. 조건 기반 선택
- df[df["봄"] > 250]
>> 봄 열의 값이 250보다 큰 행만 추출 - df[(df["여름"] > 300) & (df["겨울"] < 200)]
>> 여름열의 값이 300보다 크면서 겨울열의 값이 200보다 작은 행 추출
>> 여러 조건 조합도 가능 (&, |, 괄호 필수!)
=================================================================


[5. 데이터 통합하기]
1.두 개의 데이터를 하나로 통합하기
- 세로로 증가하는 방향으로 병합 (index 증가) "concat"
>> pd.concat ( [dataframe1, dataframe2]) - 가로로 증가하는 방향으로 병합 (columns 증가) : "join"
>> dataframe1.join(dataframe2) - 공통된 열 (key)를 중심으로 좌우로 병합 : "merge"
>> dataframe1.merge(dataframe2)
2.세로 방향 병합
- pd.concat ( [df1], [df2] ) : 각 데이터 프레임의 기존 인덱스 그대로 통합
- pd.concat ( [df1], [df2] ,ignore_index = True) : 각 데이터 프레임의 기존 인덱스들은 무시되고 새로 0부터 인덱싱
- concat은 열의 이름을 기준으로 자동으로 맞춰서 정렬하는데, 만약 concat한 객체중 없는 열이 있다면 해당 값은 자동으로 NaN으로 채워짐


3. 가로 방향 병합
- dataframe1.join(dataframe2) : 인덱스 라벨을 이용하여, 같은 인덱스끼리 가로 방향으로 데이터 추가
>> 인덱스가 다르다면 NaN 반환
>> 인덱스 중심으로 합친다는 것을 꼭 기억하기
>> 내부적으로는 merge(left_index=True, right_index=True) 와 비슷 (merge함수는 같은 열값을 붙이는데, 이건 인덱스가 같은 행을 붙이라는 의미임!)
4. 데이터 통합
- dataframe1.merge(dataframe2) : rhdxh
>> 공통된 열의 값을 기준으로 병합(공통된 인덱스 x)>> 열의 값이 같은 행끼리 붙는 것을 의미 - df1.merge(df2, how = merge_method, on = key_label)
>> on에는 키 열을 지정
>> how 선택인자

'1학년 2학기 > 머신러닝원리와 응용' 카테고리의 다른 글
| [2강_on] Linear Regression(선형회귀) (0) | 2025.03.14 |
|---|---|
| [1강_off] Python Packages (0) | 2025.03.14 |
| [1강_on] 머신러닝 개요 (Machine Learning Overview) (0) | 2025.03.13 |