[Data Processing] Pandas 기초

Oolayla·2023년 2월 13일
0

플레이데이터

목록 보기
5/15
post-thumbnail

🐼 Pandas

  • 데이터 처리와 분석을 위한 라이브러리
  • 행과 열로 이루어진 데이터 객체를 만들어 다룰 수 있음
  • 자료구조
    • Series : 1차원
    • DataFrame : 2차원
    • Panel : 3차원

🧾 Series

import pandas as pd

pd.Series(
	data = [시리즈의 데이터],
    index = [시리즈의 인덱스 (디폴트 인덱스는 0, 1, 2, ...)],
    dtype = [요소의 데이터 타입 정의],
    name = [시리즈의 이름]
)

◽ Series 생성

ex 1 ) 딕셔너리 형태로 시리즈 생성

score = {
    '국어': 90,
    '영어': 89,
    '수학': 67 
}
pd.Series(data=score, name='김개똥')
국어    90
영어    89
수학    67
Name: 김개똥, dtype: int64

ex 2 ) 리스트 형태로 시리즈 생성

subject = ['국어', '영어', '수학']
score = [90, 89, 67]
pd.Series(data=score, index=subject, name='김개똥')
국어    90
영어    89
수학    67
Name: 김개똥, dtype: int64

※ 인덱스를 새로 지정할 경우 정수형으로 하는 것은 좋지 않아 보임

# 0번째 데이터를 가져오기

index = ['one', 'two', 'three']
data = ['hello', 'i am', 'ulala']
series = pd.Series(data=data, index=index)
print(series[0])
# hello

index = [1, 2, 3]
data = ['hello', 'i am', 'ulala']
series = pd.Series(data=data, index=index)
print(series[0])
# KeyError: 0

> 내부적으로 인덱스를 뭐로 해야하는지 헷갈려 하는 듯

◽ Series 슬라이싱 / 인덱스

score = {
    '국어': 90,
    '영어': 89,
    '수학': 67 
}
series = pd.Series(data=score, name='김개똥')

print(series[0])
print('-' * 30)
print(series[:2])
print('-' * 30)
print(series.get('수학'))
print('-' * 30)
print(series.get('사회', None))
90
------------------------------
국어    90
영어    89
Name: 김개똥, dtype: int64
------------------------------
67
------------------------------
None

series[0]series[[0]]의 차이점

  • series[0] : series의 0번 인덱스에 있는 값
  • series[[0]] : series의 0번 행
print(series[0])
print('-' * 30)
print(series[[0]])
90
------------------------------
국어    90
Name: 김개똥, dtype: int64

📅 DataFrame

import pandas as pd

pd.DataFrame(
	data = [데이터프레임의 데이터],
    index = [데이터프레임의 인덱스 (디폴트 인덱스는 0, 1, 2, ...)],
    columns = [데이터프레임의 열 이름]
)

◽ DataFrame 생성

ex 1 ) 딕셔너리 형태로 데이터프레임 생성 (행 단위)

data = {
    '김개똥': [90, 89, 67],
    '임꽃님': [100, 100, 100],
    '유말년': [50, 45, 84]
}
index = ['국어', '영어', '수학']

pd.DataFrame(data=data, index=index)
김개똥임꽃님유말년
국어9010050
영어8910045
수학6710084

ex 2 ) 리스트 형태로 데이터프레임 생성 (열 단위)

data = [
    {'김개똥': 90, '임꽃님': 100, '유말년': 50},
    {'김개똥': 89, '임꽃님': 100, '유말년': 45},
    {'김개똥': 67, '임꽃님': 100, '유말년': 84}
]
index = ['국어', '영어', '수학']

pd.DataFrame(data=data, index=index)
김개똥임꽃님유말년
국어9010050
영어8910045
수학6710084

◽ DataFrame에 열 추가

초기 데이터프레임:

김개똥임꽃님유말년
국어9010050
영어8910045
수학6710084

insert 사용

df.insert(3, '박인자', [60, 60, 60])
df
김개똥임꽃님유말년박인자
국어901005060
영어891004560
수학671008460

loc 사용

df.loc[:, ['박인자']] = [0, 0, 0]
df
김개똥임꽃님유말년박인자
국어90100500
영어89100450
수학67100840

대괄호 사용

df['박인자'] = [10, 20, 30]
df
김개똥임꽃님유말년박인자
국어901005010
영어891004520
수학671008430

◽ DataFrame에 행 추가

초기 데이터프레임:

김개똥임꽃님유말년
국어9010050
영어8910045
수학6710084

loc 사용

df.loc['과학'] = [54, 100, 87, 90]
df
김개똥임꽃님유말년박인자
국어901005030
영어8910045100
수학671008476
과학541008790

concat 사용

df_pe = pd.DataFrame({
	'김개똥': [25], 
    '임꽃님': [100], 
    '유말년': [53], 
    '박인자': [50]
}, index=['체육'])
df = pd.concat([df, df_pe])
df
김개똥임꽃님유말년박인자
국어901005030
영어8910045100
수학671008476
과학541008790
체육251005350

◽ 컬럼명 변경

초기 데이터프레임:

김개똥임꽃님유말년
국어9010050
영어8910045
수학6710084

rename 사용

df = df.rename(columns={
	'김개똥': 'Kim', 
    '임꽃님': 'Lim', 
    '유말년': 'Yoo'
})

df
KimLimYoo
국어9010050
영어8910045
수학6710084

columns 사용

df.columns = ['김', '임', '유']
df
국어9010050
영어8910045
수학6710084

➰ 데이터 변환

score = {
    '국어': 90,
    '영어': 89,
    '수학': 67 
}
series = pd.Series(data=score, name='김개똥')

data = {
    '김개똥': [90, 89, 67],
    '임꽃님': [100, 100, 100],
    '유말년': [50, 45, 84]
}
index = ['국어', '영어', '수학']

df = pd.DataFrame(data=data, index=index)

◽ Series → NumPy

series.to_numpy()
array([90, 89, 67], dtype=int64)

◽ DataFrame → Dictionary

디폴트

df.to_dict()
{'김개똥': {'국어': 90, '영어': 89, '수학': 67}, 
 '임꽃님': {'국어': 100, '영어': 100, '수학': 100}, 
 '유말년': {'국어': 50, '영어': 45, '수학': 84}}

JSON 형태

df.to_dict('records')
[{'김개똥': 90, '임꽃님': 100, '유말년': 50}, 
 {'김개똥': 89, '임꽃님': 100, '유말년': 45}, 
 {'김개똥': 67, '임꽃님': 100, '유말년': 84}]

◽ 파일 내보내기

# CSV 파일로 내보내기
df.to_csv()

# 엑셀 파일로 내보내기
df.to_excel()

👆🏻 데이터 선택

import seaborn as sns

iris = sns.load_dataset('iris')
iris.head()
sepal_lengthsepal_widthpetal_lengthpetal_widthspecies
05.13.51.40.2setosa
14.93.01.40.2setosa
24.73.21.30.2setosa
34.63.11.50.2setosa
45.03.61.40.2setosa

isin()

값이 지정한 값들 중 존재하는 행들만 추출

# petal_length가 1.0 또는 1.2인 행들만 출력
condition = iris['petal_length'].isin([1.0, 1.2])

iris[condition]
sepal_lengthsepal_widthpetal_lengthpetal_widthspecies
145.84.01.20.2setosa
224.63.61.00.2setosa
355.03.21.20.2setosa

iloc()

index location : 인덱스로 값에 접근

  • df.iloc[a, b] : a행 b열

    # 0행 0열에 있는 값 반환
    iris.iloc[0, 0]
    
    # 0행 0열의 시리즈 형태 반환 (열 기준)
    iris.iloc[0, [0]]
    
    # 0행 0열의 시리즈 형태 반환 (행 기준)
    iris.iloc[[0], 0]
    
    # 0행 0열의 데이터프레임 형태 반환
    iris.iloc[[0], [0]]
  • df.iloc[[a, b], :] : a행 b행, 모든 열

    # 0행 1행, 모든 열의 데이터프레임 형태 반환
    iris.iloc[[0, 1]]
    # 또는 iris.iloc[[0, 1], :]
  • df.iloc[[a, b], [c, d]] : a행 b행, c열 d열

    # 0행 1행, 0열 1열의 데이터프레임 형태 반환
    iris.iloc[[0, 1], [0, 1]]

loc()

location : 열의 이름로 값에 접근

# 모든 행의 sepal_length와 sepal_width 열
iris.loc[:, ['sepal_length', 'sepal_width']]

◽ 마스킹

  • 특정 조건 지정
    # sepal_length가 5보다 큰 값
    mask = iris['sepal_length'] > 5
  • 해당 조건은 조건 만족 여부에 대한 정보를 가지고 있음
    mask.head()
    0     True
     1    False
     2    False
     3    False
     4    False
     Name: sepal_length, dtype: bool
  • 해당 조건을 다시 데이터프레임에 적용
    iris[mask].head()
    sepal_lengthsepal_widthpetal_lengthpetal_widthspecies
    05.13.51.40.2setosa
    55.43.91.70.4setosa
    105.43.71.50.2setosa
    145.84.01.20.2setosa
    155.74.41.50.4setosa
  • 다중 조건
    • & : AND
    • | : OR
    • ~ : NOT

select_dtypes()

데이터 형식에 기반한 열 선택

숫자형인 열 선택

iris.select_dtypes(include=np.number)
sepal_lengthsepal_widthpetal_lengthpetal_width
05.13.51.40.2
14.93.01.40.2
24.73.21.30.2
34.63.11.50.2
45.03.61.40.2

숫자형 이외의 열 선택

iris.select_dtypes(exclude=np.number)
species
0setosa
1setosa
2setosa
3setosa
4setosa
profile
울레일라

0개의 댓글