TIL - Pandas

Qtory·2023년 9월 7일
0

AI

목록 보기
3/7
post-thumbnail

💽Pandas

📚배운 강의 내용

  • Pandas 사용하기
  • Pandas로 1차원 데이터 다루기 - Series
  • Pandas로 2차원 데이터 다루기 - dataframe

📌Pandas 사용하기

먼저 pandas 패키지를 설치해야 사용할 수 있다. 터미널이나 shell에서 아래 명령어를 작동하면 된다.

pip install pandas

pandas 설치가 끝났다면 사용하는 법은 어렵지 않다. 기본적으로 import를 이용해 pandas 패키지를 불러오며 pd라고 편하게 줄여 사용하곤 한다.

import pandas as pd

📌Pandas로 1차원 데이터 다루기 - Series

❗️Series란?

  • 1-D labeled array
  • 인덱스를 지정해줄 수 있다.
s = pd.Series([1, 4, 9, 16, 25])
'''
0		1
1		4
2		9
3  	   16
4  	   25
dtype: int64
'''

t = pd.Series({'one':1, 'two':2, 'three':3, 'four':4, 'five':5})
'''
one		1
two		2
three	3
four	4
five	5
dtype: int64
'''

❗️Series + Numpy

  • Series와 ndarray의 유사점

인덱스에 접근하거나, 슬라이싱 역시 사용할 수 있다.

s = pd.Series([1, 4, 9, 16, 25])
t = pd.Series({'one':1, 'two':2, 'three':3, 'four':4, 'five':5})
s[1]
# 4

t[1]
2

t[1:3]
'''
two		2
three	3
dtype: int64
'''

median()이라는 Series의 중앙값보다 큰 값들만 불러오는 함수도 존재한다.

s[s > s.median()]
'''
3	   16
4	   25
dtype: int64
'''

또한, 여러 인덱스를 한 리스트에 묶어서 반환도 가능하다.

s[[3, 1, 4]]
'''
3	  16
1	   4
4	  25
dtype: int64
'''

Numpy의 함수 역시 사용이 가능하다.

import numpy as np

np.exp(s)
'''
0	2.718282e+00
1	5.459815e+01
2	8.103084e+03
3	8.886111e+06
4	7.200490e+10
dtype: float64
'''

s.dtype
# dtype('int64')

❗️Series + dict

  • Series와 dict의 유사점

dict의 key, value관계처럼 사용할 수 있다.

t = pd.Series({'one':1, 'two':2, 'three':3, 'four':4, 'five':5})
'''
one		1
two		2
three	3
four	4
five	5
dtype: int64
'''

t['one']
# 1

# Series에 값 추가
t['six'] = 6
'''
one		1
two		2
three	3
four	4
five	5
six		6
dtype: int64
'''

없는 요소에 접근을 하고 싶다면 어떨까?

'six' in t
# True

'seven' in t
# False

t['seven']
# error 발생

위처럼 error 혹은 False값이 반환되는 것을 알 수 있다. 이를 해결하기 위한 방법이 get()함수라고 할 수 있다. get()함수는 인자가 없다면 None을 반환한다.

t.get('seven')
# None

t.get('seven', 0) # 'seven'이 없다면 0을 반환해라
# 0

❗️Series에 naming하기

  • Series는 name 속성을 가지고 있다.
  • 처음 Series를 만들 때 이름을 붙일 수 있다.
s = pd.Series(np.random.randn(5), name='random_nums')
# randn함수는 평균 0, 표준편차 1인 표준정규분포 확률을 따르는 난수를 return한다.
'''
0	-0.902705
1	-2.821488
2	 0.536517
3	-1.195965
4	-0.446903
Name: random_nums, dtype: float64
'''

이름을 붙여줬기에 dtype옆에 이름이 표시되는 것을 알 수 있다.

(Series 변수).name = '새로운 이름'

을 통해 새로이 이름을 지정하는 것도 가능하다.


📌Pandas로 2차원 데이터 다루기 - dataframe

❗️dataframe이란?

  • 2-D labeled table
  • 인덱스를 지정할 수 있다.
import pandas as pd

d = {'height': [1, 2, 3, 4], 'weight': [30, 40, 50, 60]}
df = pd.DataFrame(d)
height weight
0 130
1 240
2 350
3460
## dtype 확인하는 법
df.dtypes
'''
height	int64
weight	int64
dtype: object
'''

❗️csv파일을 dataframe으로 불러오고 활용하기

  • Comma Separated Value를 DataFrame으로 생성할 수 있다.

  • '.read_csv()'를 이용하여 csv를 읽어온다.

    r = pd.read_csv("csv가 있는 경로")
    # 동일 경로에 있다면 ("./~~~.csv")
    # 읽어오는데에 성공했다면 a rows x b columns 라고 출력된다.

    csv파일을 불러오는데에 성공했다면 그 수많은 데이터에서 필요한 데이터만 사용할 수 있어야 한다.

  • 위에서부터 n개의 데이터를 관찰하는 법

    df.head(n)
  • 아래에부터 n개의 데이터를 관찰하는 법

    df.tail(n)
  • 필요한 열 데이터만 접근하는 법

    df['column_name'] or df.column_name
  • 🖐 dataframe의 각 column은 Series로 구성되어 있다. 따라서 위의 열 데이터만 접근하면 Series에 사용가능한 함수를 다 적용할 수 있다.

  • '조건'을 이용하여 데이터에 접근하는 법

    df['column_name'] > 100
    '''
    0	True
    1	True
    2  False
    	...
    3	True
    '''
    
    df['column_name'] == 'what_name'
    ...

    이렇게 얻어진 열을 key로서 다시 dataframe에 넣어주게 되면 조건에 해당하는, True에 해당하는 데이터들을 볼 수 있다.

    df[df['column_name'] > 100]
  • dataframe의 범주 찾기

    df['column_name'].unique()
    '''
    array(['name1', 'name2', 'name3'], dtype=object)
    '''

    위처럼 unique()함수를 사용하게 되면 그 안의 데이터가 중복없이 출력된다.

  • 행을 기준으로 데이터에 접근하기

    # 예시 데이터 - 도서관 정보
    
    books_dic = {"Available":[True, True, False], 
    			 "Location":[102,215,323],
                 "Genre":["Programming", "Physics", "Math"]}
    books_df = pd.DataFrame(books_dict, index=['책1', '책2', '책3'])
    Available Location Genre
    책1 True102Programming
    책2 True215Physics
    책3 False323Math

    인덱스를 이용해서 가져오는 법이 있다.

    # 인덱스 이름을 이용해서 가져오기
    
    # df.loc[row, col]
    books_df.loc["책1"]
    '''
    Available		True
    Location		 102
    Genre	 Programming
    Name: 책1, dtype: object
    '''
    
    # 한 요소에만 접근하기
    
    books_df.loc["책3"]['Available']
    # False
    # 숫자 인덱스를 이용해서 가져오기
    
    # df.iloc[rowidx, colidx]
    books_df.iloc[0, 1] # 인덱스 0행의 1열 가지고 오기
    # 102
    
    books_df.iloc[1, 0:2] # 인덱스 1행의 0~1열 가지고 오기
    '''
    Available	True
    Location	 215
    Name: 책2, dtype: object
    '''

    ndarray의 문법과 유사한 것을 볼 수 있다. 슬라이싱이나 행, 열에 접근하는 방식 역시 유사하다.

  • groupby 함수 이용하기

    • Split : 특정한 "기준"을 바탕으로 DataFrame을 분할
    • Apply : 통계함수 - sum(), mean(), median() - 을 적용해서 각 데이터를 압축
    • Combine : Apply된 결과를 바탕으로 새로운 Series를 생성 (group_key : applied_value)
    #
    # 1. df에서 원하는 column만 추출한다.
    # 2. 이를 df의 다른 column을 기준으로 groupby()한다.
    
    a = df['column_name'].groupby(by = df["other_colunmn"])
    # 이 상태는 분류는 되었지만 아무것도 연산되지는 않았다.
    
    a.sum()
    '''
    other column
    data1		1000
    data2		2000
    data3		2341
    Name: column_name, dtype: int64
    '''
    
    a.mean() # sum() / (각 other_column에 해당하는 데이터 수)

0개의 댓글