Pandas
import numpy as np
import pandas as pd
- pandas 패키지
- 메인 패키지!!! ==> 데이터 핸들링!!!
- 외부에서 만든 패키지!!1
- pandas 기본적인 자료형 : Series, DataFrame, Pannel
- 1차원을 처리할 자료형 : Series
- 2차원을 처리할 자료형 : DataFrame
- 3차원을 처리할 자료형 : Pannel ⇒ 내가 처리할 자료들이 어떤 차원에서 처리할지 명시화 ⇒ 일반적으로 주로 2차원 2D : DataFrame
- cf) 엑셀 통합파일 : 여러 시트...--> 3차원 : Pannel 엑셀 통합파일 내의 1개 시트 : 2차원 : DataFrame 엑셀 통합파일 내의 1개 sheet에서 1개 줄(가로/ 세로) : Series
- DL 쪽에서는 이 친구가 메인인 자료형 아님
- ML쪽에서는 2차원 행렬중심 ⇒ pandas + scikit-learn ⇒ 전통적인 ML은 나의 데이터를 어떻게 2D로 밀어넣을 것인가 비정형 데이터는 주로 피하거나, 잘 안 되거나… 정형데이터
- 1D 표현하는 자료형 : Series
- 직접적으로 사용할 일은 별로 없음
- 기능적으로 유사해서 확장임
- 쌩 파이썬 리스트
- numpy의 array 자료형
- 1차원 : pandas Series
- 2차원: pandas DataFrame
- …
벡터연산 내가 만든 인덱스로 접근하자 불리언 인덱싱 + 가로/세로 접근경로: 정수기반 + 내꺼
- numpy의 array 자료형
- pandas의 히스토리
- 파이썬을 가지고 금융처리를 하고싶었던 사람이 있었음
- 언제, 얼마인지 → 장이 열리는 날, 안 열리는 날, 휴일
- ⇒ 날짜 중심으로 데이터를 찾으려고하면 내가 원하는 날짜가 내 데이터의 몇번째를 찾아야하는지 이슈가 됨 ⇒ ⇒ 날짜 중심의 주식 가격 데이터 접근이 필요해서 판다스 만들게 된 것….
- df[날짜] : 직접 내가 원한 세팅값을 기반으로 값을 접근하자
- ⇒ 여러 자료형을 같이 다루면서, 내가 원하는 인덱스로 접근을 유연하게 하자는 결론
- ⇒ 사람마다/ 데이터마다 워낙 다양하기 때문에 유연함을 주고싶었던 것
- ⇒ 단점
- 시간과 속도에 대한 부분이 느림 (-)
- 적당한 사이즈에 대한 데이터에 한정된 핸들링 → 근데 왜 쓰냐? (코드가 편해서) ⇒ 데이터 사이즈가 큰 경우 GPU or PySpark etc를 쓰기도 함 ⇒ 회사 상황에서는 팀에서 사용하는 것이나 사용하시는 시스템 기반으로 하면 됨
- 삼성전자 주가 데이터를 처리하고 싶다
- 종가 1개만 생각을 먼저 하겠다
- 70000, 73000. 69000.72000 → 1차원으로 종가 가격만 모아두면 됨 (리스트, array etc)
- 오늘 가격은 얼마에요? -1
- 지난 주 목요일은 얼마? 뒤에서 -2번째가 지난주 목요일 →직접 손가락으로 체크
-
- 주말, 휴일, 더 애매한 경우도 있다...
- 정수 인덱스로만 접근하기에은 불편
- 정수 인덱스 사용 + 내가 만든 인덱스 접근!!! (접근 경로 : 기존 정수인덱스 + 내가 날짜도 접근!)
-
- 종가 1개만 생각을 먼저 하겠다
# 생성1) 쌩 파이썬 리스트
stock_price_list = [70000, 73000, 69000, 72000]
# 생성2) numpy array
stock_price_arr = np.array(stock_price_list )
# 생성3) pandas --> 1차원 --> Series : S대문자!!!
stock_price_Series = pd.Series( stock_price_list)
stock_price_list
#[70000, 73000, 69000, 72000]
stock_price_arr
#array([70000, 73000, 69000, 72000])
stock_price_Series
#옆 사진 1
#1번 주식 가격에 대한 접근
print(stock_price_list[0])
print(stock_price_arr[0])
print(stock_price_Series[0])
#70000
#70000
#70000
print( stock_price_list[0:4])
print( stock_price_arr[0:4])
print( stock_price_Series[0:4])
#[70000, 73000, 69000, 72000]
#[70000 73000 69000 72000]
#0 70000
#1 73000
#2 69000
#3 72000
#dtype: int64
# +++ 앞의 리스트/ array/Series 별로 차이가 안 보임
# +++ 나만의 접근 경로 : 나만의 인덱스를 만들자: pandas
stock_price_Series_index = pd.Series(
#정보: 진짜 리얼한 데이터
# : 나만 접근할 수 있는 인덱스 정보
data = [70000, 73000, 69000, 72000, 71000],
index = ["2025-08-01", "2025-08-02", "2025-08-03",
"2025-08-04", "2025-08-5"]
)
stock_price_Series_index
# 사진2
stock_price_Series_index[0]
#/tmp/ipython-input-2592654350.py:1: FutureWarning: Series.__getitem__ treating keys as positions is deprecated. In a future version, integer keys will always be treated as labels (consistent with DataFrame behavior). To access a value by position, use `ser.iloc[pos]`
# stock_price_Series_index[0]
#np.int64(70000)
stock_price_Series_index[0:4]
#사진3
stock_price_Series_index["2025-08-03"]
#np.int64(69000)
stock_price_Series_index["2025-08-03":"2025-08-5"]
#사진4
# --> 태생적인 정수 인덱스 슬라이싱 : 끝점이 skip
# 내가 만든 인덱스 슬라이싱 : 끝점이 일치하면 포함됨
stock_price_Series_index["2025-08-05"]
# 오류
# -=-> 쌩파이썬의 dict 의 key 처럼 ExactMatching!!!!
# 대소문자/ 공백/ 패딩 etc : 유의사항!!!
numpy의 array했던 거의 모든 것들이 유사하겠구나
- 불리언 인덱싱 : 조건 필터링
- ex) 주식 가격이 70000원 이상인 데이터만 보여주세요!!!!!

참고) 쌩 파이썬의 dict와 상당히 유사
- dictionary ⇒ key-value
- pandas ⇒ index(정수기반 +내가 만드는 것) - value
stock_price_Series_index.index
#Index(['2025-08-01', '2025-08-02', '2025-08-03', '2025-08-04', '2025-08-5'], dtype='object')
stock_price_Series_index.values
#array([70000, 73000, 69000, 72000, 71000])stock_price_Series_index + 10000 #당연히 벡터연산 가능
stock_price_Series_index + 10000 #당연히 벡터연산 가능

참고) in
- 자료형이 쌩 파이썬 list → value 중심으로 있는지 체크
- “ dict → key 중심으로 있는지 체크
- pandas S/DF/P → index 중심으로 체크
"2025-08-5" in stock_price_Series_index
#True
81000 in stock_price_Series_index
#False
"2025-08-05" in stock_price_Series_index
#False
쌩 파이썬 Dict ↔ pandas 상당히 연결성/유사성 있음
- 데이터 수집을 하는 과정에서도 상호호환으로 같이 사용할 수 있음 (크롤링할 때)
s_data = { "AAPL": 1000, "MS":2000, "TSLA": 3000}
s_data
#{'AAPL': 1000, 'MS': 2000, 'TSLA': 3000}
s_data["AAPL"]
#1000
s_data[0]
#오류남 -> 딕셔너리는 키값으로만 접근 가능
s_data_Series = pd.Series( s_data)
s_data_Series

s_data_Series["AAPL"] #얘는 내가 만든 인덱스, 정수 인덱스 모두 사용 가능
#np.int64(1000)
s_data_Series[0] #얘는 내가 만든 인덱스, 정수 인덱스 모두 사용 가능
#/tmp/ipython-input-670982772.py:1: FutureWarning: Series.__getitem__ treating keys as positions is deprecated. In a future version, integer keys will always be treated as labels (consistent with DataFrame behavior). To access a value by position, use `ser.iloc[pos]`
# s_data_Series[0]
#np.int64(1000)
# dict 할 때
s_data = { "AAPL": 1000, "MS":2000, "TSLA": 3000} # 전체 데이터 셋
ticker = ["GOOGLE", "AAPL","MS", "META"] # 관심있는 업체들 ticker
s_2 = pd.Series(s_data, index = ticker)
s_2

결측치에 대한 발생을 늘 염두해야함
- why?
- 파이썬은 대충 돌아가는 부분이 있음
- 엄밀성 좀 떨어짐 ⇒ 에러가 표면적으로 안 보이는 경우들이 있음
- pandas : NaN, “”, None
- mysql : null —> is null, in not null
s_1 = pd.Series(s_data)
s_1
s_2
s_1 + s_2
# ==> numpy의 기본적인 벡터연산 가지고 있음!!!!
# 단, 위치/순서 중심으로 벡터연산 수행을 함
# ==> pandas에서 index 중심으로 벡터연산
# + pandas에서 index : 대충 + 틱하게
# + 원하지 않은 row 생성될수도 있다
# + 항상 꼼꼼하게 수 체크
참고 ) 결측치에 대한 처리
- 자주 사용되는 기능 → 메서드 만들어둠
- is null / is not null
- .isnull(): 너 값이 결측값이야? T/F
- .notnull(): 너 값이 정상값이야? T/F
temp = s_1 + s_2
temp
temp.isnull()
# --> 실제 받은 데이터 중에서,,결측치 데이터만 체크!!!
# ==> 결측 데이터가 있다면,,실제로 좀 보자!!!!
temp[temp.isnull()]
#정상적인 데이터만 보자
temp[temp.notnull()]
# --> ""은 나올 수 있음 => 명시적으로 NaN이 아닌 것만 이야기를 함
#기타
temp.ndim
#1
temp.shape
#(5,)
len(temp)
#5
temp.dtype
#dtype('float64')'데이터분석 > Pandas' 카테고리의 다른 글
| [Python] Pandas 06 _ kobis_api_xml (0) | 2025.08.20 |
|---|---|
| [Python] pandas 05_kobis_api_json (0) | 2025.08.19 |
| [Python] Pandas 04 _ json (0) | 2025.08.19 |
| [Python] Pandas 03 _ pandas_2D_DataFrame (3) | 2025.08.19 |
| [Python] Pandas 02 _pandas_1D_Series (2) (0) | 2025.08.19 |