본문 바로가기
데이터분석/Pandas

[Python] Pandas 02 _pandas_1D_Series (1)

by nemonemonemo 2025. 8. 18.

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
      • … 
        벡터연산  내가 만든 인덱스로 접근하자
        불리언 인덱싱 + 가로/세로 접근경로: 정수기반 + 내꺼
  • pandas의 히스토리
    • 파이썬을 가지고 금융처리를 하고싶었던 사람이 있었음
    • 언제, 얼마인지 → 장이 열리는 날, 안 열리는 날, 휴일
    • ⇒ 날짜 중심으로 데이터를 찾으려고하면 내가 원하는 날짜가 내 데이터의 몇번째를 찾아야하는지 이슈가 됨 ⇒ ⇒ 날짜 중심의 주식 가격 데이터 접근이 필요해서 판다스 만들게 된 것….
    • df[날짜] : 직접 내가 원한 세팅값을 기반으로 값을 접근하자
  • ⇒ 여러 자료형을 같이 다루면서, 내가 원하는 인덱스로 접근을 유연하게 하자는 결론
  • ⇒ 사람마다/ 데이터마다 워낙 다양하기 때문에 유연함을 주고싶었던 것
  • ⇒ 단점
    • 시간과 속도에 대한 부분이 느림 (-)
    • 적당한 사이즈에 대한 데이터에 한정된 핸들링 → 근데 왜 쓰냐? (코드가 편해서) ⇒ 데이터 사이즈가 큰 경우 GPU or PySpark etc를 쓰기도 함 ⇒ 회사 상황에서는 팀에서 사용하는 것이나 사용하시는 시스템 기반으로 하면 됨
  • 삼성전자 주가 데이터를 처리하고 싶다
    • 종가 1개만 생각을 먼저 하겠다
      • 70000, 73000. 69000.72000 → 1차원으로 종가 가격만 모아두면 됨 (리스트, array etc)
    • 오늘 가격은 얼마에요? -1
    • 지난 주 목요일은 얼마? 뒤에서 -2번째가 지난주 목요일 →직접 손가락으로 체크
        • 주말, 휴일, 더 애매한 경우도 있다...
      • 정수 인덱스로만 접근하기에은 불편
      • 정수 인덱스 사용 + 내가 만든 인덱스 접근!!! (접근 경로 : 기존 정수인덱스 + 내가 날짜도 접근!)
# 생성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