HomeAboutMeBlogGuest
© 2025 Sejin Cha. All rights reserved.
Built with Next.js, deployed on Vercel
📩
캐글 데이터로 살펴보는 데이터분석 With Python and SAS
/
🕓
4.8.2. Pandas
🕓

4.8.2. Pandas

notion image

목차

목차PandasSeries산술연산비교 연산자집계함수DataFrame결측값 처리MultiIndex데이터 사전 분석값의 연결
 

Pandas

  • 데이터를 분석할 때 가장 많이 쓰이는 라이브러리다.
  • 행과 열을 쉽게 처리할 수 있는 함수를 제공하는 도구이다.
    • ※ 각 열은 단일 데이터 형식만 저장
  • numpy보다 유연하게 수치 연산 가능하다.
입력
 
출력

Series

  • index와 values로 이루어진 1차원 배열이다.
  • 모든 유형의 데이터를 보유할 수 있다.
  • 인덱스를 지정해 줄 수 있다.
  • 인덱스 길이는 데이터의 길이와 같아야 한다.
  • 명시적 인덱스와 암묵적 인덱스를 가진다.
    • loc : 인덱스값을 기반으로 행 데이터를 읽는다.
    • iloc : 정수 인덱스을 기반으로 행 데이터를 읽는다.
입력
 
출력
 
입력
 
출력
 
입력
 
출력
 
입력
 
출력
 
입력
 
출력
 
입력
 
출력
 

산술연산

입력
 
출력
 
입력
 
출력
 
입력
 
출력
 
입력
 
출력
 
입력
 
출력
 
입력
 
출력
 
입력
 
출력
 
입력
 
출력
 

비교 연산자

입력
 
출력
 
입력
 
출력
 
입력
 
출력
 

집계함수

  • add : 더하기 함수
  • sub : 빼기 함수
  • mul : 곱하기 함수
  • div : 나누기 함수
  • mod : 나머지 구하는 함수
  • min : 최소값 구하는 함수
  • max : 최대값 구하는 함수
  • mean : 평균 구하는 함수
  • median : 중앙값 구하는 함수
  • std : 표준편차 구하는 함수
  • var : 분산 구하는 함수
입력
 
출력
 
입력
 
출력
 
입력
 
출력
 
입력
 
출력
 
입력
 
출력
 
입력
 
출력
 
입력
 
출력
 
입력
 
출력
 
입력
 
출력
 
입력
 
출력
 
입력
 
출력
 
입력
 
출력
 

DataFrame

  • 2차원 배열에 행과 열에 인덱스를 붙인 것이다.
  • 가장 기본적인 데이터 구조이다.
입력
 
출력
 
입력
 
출력
 
입력
 
출력
 
입력
 
출력
 
입력
 
출력
 
입력
 
출력
 
입력
 
출력
 
입력
 
출력
 
입력
 
출력
 

결측값 처리

  1. NaN
      • 자료형이 Float형이다.
      • 배열에서 연산할 경우 오류가 발생하지 않지만 결과값이 NaN이 된다.
  1. None
      • 자료형이 None이다.
      • 배열 연산을 할 경우 오류가 발생한다.
3. 처리방법
  • isnull() : 결측값 확인 (결측 이면 True , 결측이 아니면 False )
  • notnull() : 결측값 확인 (결측 이면 False , 결측이 아니면 True )
  • dropna() : 결측값 삭제
    • inplace = True : drop후 원본에 반영
  • fillna(Num) : 결측값을 Num으로 채워 넣는다.
입력
 
출력
 
입력
 
출력
 
입력
 
출력
 
입력
 
출력
 
입력
 
출력
 
입력
 
출력
 
입력
 
출력
 
입력
 
출력
 

MultiIndex

  • Index를 설정할 때 리스트의 리스트 형태로 넣어주면 다중 인덱스가 설정이 된다.
입력
 
출력
 
입력
 
출력
 
입력
 
출력
 
입력
 
출력
 
입력
 
출력
 
입력
 
출력
 
입력
 
출력
 
입력
 
출력
 

데이터 사전 분석

  • info() : DataFrame을 구성하는 행과 열에 대한 정보를 나타내 주는 함수
  • head(n) : DataFrame의 처음부터 n줄의 행을 출력
  • tail(n) : DataFrame의 마지막 n줄의 행을 출력
  • describe() : Series, DataFrame의 각 열에 대한 요약 통계
  • dtypes : 데이터 자료형 확인
입력
 
출력
 
입력
 
출력
 
입력
 
출력
 
입력
 
출력
 
입력
 
출력
 
입력
 
출력
 
입력
 
출력
 
입력
 
출력
 

값의 연결

  • concat : DataFrame끼리 결합
    • axis=0 or 1 : 아래로 데이터 연결 / 옆으로 데이터 연결
  • append : 마지막 행에 데이터를 추가
※ concatenate : 배열끼리 결합
입력
 
출력
 
입력
 
출력
 
입력
 
출력
 
입력
 
출력
 
입력
 
출력
import pandas as pd pd.__version__ pd? # tab 누르면 사용가능한 여러가지 method를 볼 수 있다.
1.0.1
import pandas as pd import numpy as np
data = np.arange(0, 50, 10) data
array([ 0, 10, 20, 30, 40])
a = pd.Series(data, index=['a', 'b', 'c', 'd', 'e']) print(a)
a 0 b 10 c 20 d 30 e 40 dtype: int32
b = pd.Series(data) b
0 0 1 10 2 20 3 30 4 40 dtype: int32
a['b']
10
a.loc['b']
10
a.iloc[1]
10
a
a 0 b 10 c 20 d 30 e 40 dtype: int32
# 더하기 a + 10
a 10 b 20 c 30 d 40 e 50 dtype: int32
# 빼기 a - 10
a -10 b 0 c 10 d 20 e 30 dtype: int32
# 곱하기 a * 10
a 0 b 100 c 200 d 300 e 400 dtype: int32
# 거듭제곱 a ** 2
a 0 b 100 c 400 d 900 e 1600 dtype: int32
# 나누기 a / 5
a 0.0 b 2.0 c 4.0 d 6.0 e 8.0 dtype: float64
# 몫 a // 5
a 0 b 2 c 4 d 6 e 8 dtype: int32
# 나머지 a % 3
a 0 b 1 c 2 d 0 e 1 dtype: int32
a
Out[-] a 0 b 10 c 20 d 30 e 40 dtype: int32
a > 15
a False b False c True d True e True dtype: bool
a[a>15]
c 20 d 30 e 40 dtype: int32
a.add(100)
a 100 b 101 c 102 d 103 e 104 dtype: int32
a.sub(100)
a -100 b -90 c -80 d -70 e -60 dtype: int32
a.mul(100)
a 0 b 1000 c 2000 d 3000 e 4000 dtype: int32
a.div(100)
a 0.0 b 0.1 c 0.2 d 0.3 e 0.4 dtype: float64
a.mod(3)
a 0 b 1 c 2 d 0 e 1 dtype: int32
a.min()
0
a.max()
40
a.sum()
100
a.mean()
Out[-] 20.0
a.median()
20.0
a.std()
15.811388300841896
a.var()
250.0
# 50부터 100사이, 4x3형태로 랜덤 생성 rawData = np.random.randint(50, 100, size=(4, 3)) rawData
array([[72, 61, 98], [83, 90, 91], [55, 71, 89], [71, 71, 76]])
df = pd.DataFrame(rawData, index=['1반', '2반', '1반', '2반'], columns=['국', '영', '수']) df
국 영 수 1반 72 61 98 2반 83 90 91 1반 55 71 89 2반 71 71 76
#df[0] -> Error df['국']
1반 72 2반 83 1반 55 2반 71 Name: 국, dtype: int32
df
국 영 수 1반 72 61 98 2반 83 90 91 1반 55 71 89 2반 71 71 76
# 열을 추가하여 평균 구하기 df['평균'] = round((df['국']+df['영']+df['수'])/3, 2) df
국 영 수 평균 1반 72 61 98 77.00 2반 83 90 91 88.00 1반 55 71 89 71.67 2반 71 71 76 72.67
# 열('na') 추가하고 NaN값을 넣기 df["na"] = np.nan df
국 영 수 평균 na 1반 72 61 98 77.00 NaN 2반 83 90 91 88.00 NaN 1반 55 71 89 71.67 NaN 2반 71 71 76 72.67 NaN
# del 삭제 del df['na'] df
국 영 수 평균 1반 72 61 98 77.00 2반 83 90 91 88.00 1반 55 71 89 71.67 2반 71 71 76 72.67
df[df.평균 > 75]
국 영 수 평균 1반 72 61 98 77.0 2반 83 90 91 88.0
df = df.drop(["평균"], axis = 'columns') df
국 영 수 1반 72 61 98 2반 83 90 91 1반 55 71 89 2반 71 71 76
df = df.astype('float64') # 타입 변경 df
국 영 수 1반 72.0 61.0 98.0 2반 83.0 90.0 91.0 1반 55.0 71.0 89.0 2반 71.0 71.0 76.0
df['수'][2] = np.nan df
국 영 수 1반 72.0 61.0 98.0 2반 83.0 90.0 91.0 1반 55.0 71.0 NaN 2반 71.0 71.0 76.0
df.dropna(axis=0) # inplace=True # axis=0 : 행 삭제
국 영 수 1반 72.0 61.0 98.0 2반 83.0 90.0 91.0 2반 71.0 71.0 76.0
df
국 영 수 1반 72.0 61.0 98.0 2반 83.0 90.0 91.0 1반 55.0 71.0 NaN 2반 71.0 71.0 76.0
df.dropna(axis=1) # axis=1 : 열 삭제
국 영 1반 72.0 61.0 2반 83.0 90.0 1반 55.0 71.0 2반 71.0 71.0
df.fillna('hello')
국 영 수 1반 72.0 61.0 98 2반 83.0 90.0 91 1반 55.0 71.0 hello 2반 71.0 71.0 76
df.fillna(0) # 0으로 대체
국 영 수 1반 72.0 61.0 98.0 2반 83.0 90.0 91.0 1반 55.0 71.0 0.0 2반 71.0 71.0 76.0
df.fillna(df.mean()) # 평균으로 대체
국 영 수 1반 72.0 61.0 98.000000 2반 83.0 90.0 91.000000 1반 55.0 71.0 88.333333 2반 71.0 71.0 76.000000
df
국 영 수 1반 72.0 61.0 98.0 2반 83.0 90.0 91.0 1반 55.0 71.0 NaN 2반 71.0 71.0 76.0
# index 와 columns을 바꿈 df.T
1반 2반 1반 2반 국 72.0 83.0 55.0 71.0 영 61.0 90.0 71.0 71.0 수 98.0 91.0 NaN 76.0
df
국 영 수 1반 72.0 61.0 98.0 2반 83.0 90.0 91.0 1반 55.0 71.0 NaN 2반 71.0 71.0 76.0
df.index = [['1학년', '1학년', '2학년', '2학년'], ['1반', '2반', '1반', '2반']] df
국 영 수 1학년 1반 72.0 61.0 98.0 2반 83.0 90.0 91.0 2학년 1반 55.0 71.0 NaN 2반 71.0 71.0 76.0
df.columns = [['언어', '언어', '수리'],['국', '영', '수']] df
언어 수리 국 영 수 1학년 1반 72.0 61.0 98.0 2반 83.0 90.0 91.0 2학년 1반 55.0 71.0 NaN 2반 71.0 71.0 76.0
df['언어']['국']
1학년 1반 72.0 2반 83.0 2학년 1반 55.0 2반 71.0 Name: 국, dtype: float64
df.iloc[0]
언어 국 72.0 영 61.0 수리 수 98.0 Name: (1학년, 1반), dtype: float64
df.loc['1학년']
언어 수리 국 영 수 1반 72.0 61.0 98.0 2반 83.0 90.0 91.0
df.loc['1학년'].loc['1반']
언어 국 72.0 영 61.0 수리 수 98.0 Name: 1반, dtype: float64
df
언어 수리 국 영 수 1학년 1반 72.0 61.0 98.0 2반 83.0 90.0 91.0 2학년 1반 55.0 71.0 NaN 2반 71.0 71.0 76.0
df.info()
<class 'pandas.core.frame.DataFrame'> MultiIndex: 4 entries, (1학년, 1반) to (2학년, 2반) Data columns (total 3 columns): (언어, 국) 4 non-null float64 (언어, 영) 4 non-null float64 (수리, 수) 3 non-null float64 dtypes: float64(3) memory usage: 248.0+ bytes
df.head()
언어 수리 국 영 수 1학년 1반 72.0 61.0 98.0 2반 83.0 90.0 91.0 2학년 1반 55.0 71.0 NaN 2반 71.0 71.0 76.0
df.tail()
언어 수리 국 영 수 1학년 1반 72.0 61.0 98.0 2반 83.0 90.0 91.0 2학년 1반 55.0 71.0 NaN 2반 71.0 71.0 76.0
df.dtypes
언어 국 float64 영 float64 수리 수 float64 dtype: object
df.describe()
언어 수리 국 영 수 count 4.000000 4.000000 3.000000 mean 70.250000 73.250000 88.333333 std 11.528949 12.120919 11.239810 min 55.000000 61.000000 76.000000 25% 67.000000 68.500000 83.500000 50% 71.500000 71.000000 91.000000 75% 74.750000 75.750000 94.500000 max 83.000000 90.000000 98.000000
df.isnull() # 결측값 확인, 결과는 bool 형태로 출력
언어 수리 국 영 수 1학년 1반 False False False 2반 False False False 2학년 1반 False False True 2반 False False False
df.isnull().sum() # 결측값 개수 확인
언어 국 0 영 0 수리 수 1 dtype: int64
a = pd.DataFrame(np.arange(1, 10).reshape(3, 3)) a
0 1 2 0 1 2 3 1 4 5 6 2 7 8 9
b = pd.Series(np.arange(10, 40, 10)) b
0 10 1 20 2 30 dtype: int32
pd.concat([a, b], axis=1)
0 1 2 0 0 1 2 3 10 1 4 5 6 20 2 7 8 9 30
pd.concat([a, b], axis=1, ignore_index=True)
0 1 2 3 0 1 2 3 10 1 4 5 6 20 2 7 8 9 30
a.append(b, ignore_index=True)
0 1 2 0 1 2 3 1 4 5 6 2 7 8 9 3 10 20 30