Pandas

Pandas는 데이터 처리와 분석을 위한 Python 라이브러리이다.

행과 열로 이루어진 데이터 객체(데이터 프레임)를 만들어 데이터를 다룬다.

 

데이터프레임(Dataframe)

데이터프레임은 데이터 분석에서 가장 중요한 데이터 구조이다.

흔히 Excel구조와 같은 2차원 형태이다.

 

아래 그림이 Dataframe의 예시이다.

  • 열, 컬럼: name, number, score
  • 행, 로우: [Kim, 1, A] 와 같은 가로 한줄 한줄

DataFrame

 

시리즈 Series

시리즈는 하나의 정보에 대한 데이터의 지합을 의미한다.

1차원의 형태로 데이터 프레임에서 하나의 열을 떼어낸 것의 자료형은 Series이다.

 

 

Pandas 기초 메소드 및 함수 실습

라이브러리 불러오기

import pandas as pd

 

 

연습할 데이터 읽어오기

path = "https://raw.githubusercontent.com/Datamanim/pandas/main/lol.csv"

data = pd.read_csv(path, sep='\t') # 데이터가 \t로 구분되어 있어서 sep option을 줌.
data

 

불러온 데이터 구조 확인하기

1. df.head()

상위 데이터 조회

# 기본값: 앞쪽 상위 5개 데이터 확인
# data.head(3): 상위 3개 데이터 조회
data.head()

 

2. df.tail()

하위 데이터 조회

 

3. df.shape

# 데이터프레임의 모양 확인 (행의 수 , 열의 수) 형태
data.shape

 

4. df.info()

# 인덱스, 열, 값 개수, 데이터 형식 정보 등을 조회
data.info()

 

5. df.describe()

NaN 데이터는 자동으로 제외하고 수행한다.

  • count: 데이터 개수
  • mean: 데이터 평균
  • std: 데이터 표준편차
  • min: 데이터 최소값
  • 25%, 50%, 75%: 백분위수 지점
  • max: 데이터 최대값
# 데이터의 기초 통계 정보 확인
data.describe()

 

다양한 메소드 사용해보기

정렬

1. sort_index(ascending=False)

인덱스를 기준으로 정렬하기

- ascending=False: 내림차순

- ascending=True: 오름차순

data.sort_index(ascending=False)

 

2. sort_values(by=target, ascending=Fasle)

특정 열을 기준으로 정렬하기

 

- 열 하나 기준

data.sort_values(by="seasonId", ascending=False)

 

 

- 열 여러개 기준

data.sort_values(by=["seasonId", "winner"], ascending=False)

 

고유 값 확인

고유 값 확인을 위한 예제 데이터 불러오기

path = "https://raw.githubusercontent.com/Datamanim/datarepo/main/churnk/X_train.csv"
data = pd.read_csv(path)

 

1. value_counts()

특정 열의 고유한 값들의 개수들을 반환

data['Geography'].value_counts()

 

2. unique()

특정 열의 고유한 값들을 array 로 반환

data['Geography'].unique()

 

 

loc 메소드를 통해 특정 조건의 데이터 조회하기

df.loc[행 조건, 열 이름]

  • 열 이름 생략하면 전체 열을 조회한다.
  • 열 이름 한개로 조회하는 경우 시리즈로 조회
  • 열 이름 리스트 형태로 조회하는 경우 데이터프레임으로 조회
# Geography 열의 값이 Germany인, 데이터의 Surname 열을 조회
data.loc[data['Geography'] == "Germany", "Surname"]

 

# Geography 열의 값이 Germany인 모든 데이터의 전체 열을 조회
data.loc[data['Geography'] == "Germany"]

 

범위 조회 또는 포함 조회

1. df.isin([value1, value2, ...])

매개변수 리스트 내에 포함되는 데이터만 조회

# Geography가 Germany와 France인 데이터만 조회
data.loc[data['Geography'].isin(["Germany", "France"])]

 

2. df.between(value1, value2)

# Tenure값이 1과 4사이인 데이터만 조회
data.loc[data['Tenure'].between(1, 4)]

 

 

집계함수

df.집계함수() 사용시 모든 각 열에 대한 집계함수의 결과를 시리즈 형식으로 보여준다.

  1. sum() : 합
  2. mean() : 평균
  3. max() : 최대값
  4. min() : 최소값
  5. count() : 개수
data = pd.DataFrame([
    [1,2,3,4],
    [5,6,7,8],
    [9,10,11,12],
    [13,14,15,16]
])

data

 

df.집계함수()

print(("=" * 4) + "sum" + ("=" * 4))
print(data.sum(), end="\n\n")

print(("=" * 4) + "mean" + ("=" * 4))
print(data.mean(), end="\n\n")

print(("=" * 4) + "min" + ("=" * 4))
print(data.min(), end="\n\n")

print(("=" * 4) + "max" + ("=" * 4))
print(data.max(), end="\n\n")

print(("=" * 4) + "count" + ("=" * 4))
print(data.count(), end="\n\n")

 

df[열 번호].집계함수()

0번째 열에 대한 집계함수의 결과를 반환

print(("=" * 4) + "sum" + ("=" * 4))
print(data[0].sum(), end="\n\n")

print(("=" * 4) + "mean" + ("=" * 4))
print(data[0].mean(), end="\n\n")

print(("=" * 4) + "min" + ("=" * 4))
print(data[0].min(), end="\n\n")

print(("=" * 4) + "max" + ("=" * 4))
print(data[0].max(), end="\n\n")

print(("=" * 4) + "count" + ("=" * 4))
print(data[0].count(), end="\n\n")

 

그룹으로 묶어서 집계하기 :: groupby()

문법

df.groupby('집계기준변수', as_index=False)['집계대상변수'].집계함수

  • 집계기준변수: 범주형 변수 
    • 여러개 값 가능, 리스트로 넣는다.
  • 집계대상변수: 집계함수로 집계할 변수 혹은 리스트
    • 여러개 값 가능, 리스트로 넣는다.
  • ex) 월별 매출액의 합계 
    • 집계기준변수: 월
    • 집계대상변수: 매출액
  • option
    • as_index=True
      • 집계기준 변수를 인덱스로 사용한다.
# 월별 매출액의 합계가 시리즈로 조회됨
df.groupby('월', as_index=True)['매출액'].sum()

# 월별 매출액의 합계가 데이터프레임으로 조회됨
df.groupby('월', as_index=True)[['매출액']].sum()
df.groupby('월', as_index=False)['매출액'].sum()

 

여러개의 집계함수 한번에 값 얻기

.agg()

  • 열 하나에 대해 합계, 평균 등의 집계 함수를 한 번에 수행할 수 있게 하는 메소드
  • agg() 메소드의 매개변수로 수행하길 원하는 집계함수 이름을 리스트 형태로 넣어준다.

기본 문법

# 월별 매출액의 합계, 평균, 최대값을 구한다.
df.groypby('월')['매출액'].agg(['sum', 'mean','max'])

 

 

여러 열에 대해 각 열마다 다른 집계 수행

# 월별 매출액에 대해서는 평균, 팁에 대해서는 합계를 구한다.
df.groupby('월', as_index=False).agg({'매출액': 'mean', '팁': 'sum'})

 

728x90

'Language > Python' 카테고리의 다른 글

[Pandas] 시계열 데이터 처리  (0) 2024.03.01
[Pandas] 데이터분석을 위한 데이터 전처리  (2) 2024.03.01
[Numpy] Numpy 기초  (0) 2024.02.29
[Python] List, Dictionary  (0) 2024.02.28

Numpy

Numpy는 수치해석, 통계관련 기능을 제공하는 Python 라이브러리이다.

 

용어

  • Axis: 배열의 각 축을 의미
    • 2차원에서 axis0은 열방향( ⬇️ ), axis1은 행방향을 의미( ➡️ )
  • Rank: 축의 개수 (차원), ex)  1차원, 2차원, 3차원 ...
  • Shape: 축의 개수

라이브러리 불러오기

  1. 별칭 없이 라이브러리 불러오기
  2. 별칭을 주고 라이브러리 불러오기
  3. 특정 함수만 불러오기
# 별칭 없이 라이브러리 불러오기
import numpy

a = numpy.array([1,2])

# 별칭 주고 라이브러리 불러오기
import numpy as np
a = np.array([1,2])

# 특정 함수만 불러오기
from numpy import array
a = array([1,2])

 

배열 만들기 numpy.array(리스트)

1차원 배열

# 라이브러리 
import numpy as np

# 1차원 배열 생성
a = np.array([1,2,3])

# 차원
print(a.ndim) # 1

# 모양
print(a.shape) # (3, ) 원소 3개인 1차원 배열

# 데이터 형식
print(a.dtype) # int

# 배열 원소 조회
print(a[0], a[1], a[2]) # 1 2 3

 

2차원 배열

# 라이브러리 
import numpy as np

# 1차원 배열 생성
a = np.array([[1,2,3],
			[4,5,6],
            [7,8,9]])

# 차원
print(a.ndim) # 2

# 모양
print(a.shape) # (3, 2) 원소 3개인 2차원 배열

# 데이터 형식
print(a.dtype) # int

# 배열 원소 조회
print(a[0][0], a[1][1], a[2][2]) # 1 5 9

 

 

3차원 배열

# 라이브러리 
import numpy as np

# 1차원 배열 생성
a = np.array([
    [[1,2,],[3,4]],
    [[5,6],[7,8]]
])

# 차원
print(a.ndim) # 3

# 모양
print(a.shape) # (2, 2, 2) (2,2) 크기의 2차원 배열이 2개

# 데이터 형식
print(a.dtype) # int

# 배열 원소 조회
print(a[0][0], a[1][1]) # [1 2] [7 8]

 

Axis0 의 의미

  • 데이터의 건수를 의미한다.

2차원 데이터의 Shape가 (200, 4) 이라고 가정해보자. 이때 의미는 컬럼이 4개인 데이터가 100개 있다는 의미이다.

코드로 작성해서 확인해보면 다음과 같다.

# 라이브러리 
import numpy as np

a0 = ['Kim', 20, 201324, 'A']
student = np.array([a0] * 100)
print(student.shape) # (100, 4)
print(student.ndim) # 2

 

a0 은 학생a의 이름, 나이, 학번, 성적 정보를 가지고 있는 리스트이다.

해당 리스트를 np.array() 메소드를 통해서 100개의 데이터를 배열로 만드는 코드이다.

shape를 확인해보면 4개의 컬럼으로 이루어진 100개의 데이터다! 라는 것을 확인할 수 있고, ndim (차수)가 2차원 인것을 확인할 수 있다.

 

Reshape

기존 배열의 Shape를 새로운 형태의 배열로 재구성하는 함수

배열.reshape(행, 열)

np.reshape(배열, 행, 열)

  • array.reshape(3, -1) # array를 3행으로 된 배열로 변환
  • array.resahpe(-1, 3) # array를 3열로 된 배열로 변환
import numpy as np

list_a = [[1,2,3], [4,5,6], [7,8,9], [10,11,12]]

array_a = np.array(list_a)
print(array_a)
# [[ 1  2  3]
#  [ 4  5  6]
#  [ 7  8  9]
#  [10 11 12]]
print(array_a.shape) # (4, 3)

array_a = array_a.reshape(12, )
print(array_a)
# [ 1  2  3  4  5  6  7  8  9 10 11 12]
print(array_a.shape) # (12, )

array_a = array_a.reshape(6, -1)
print(array_a)
# [[ 1  2]
#  [ 3  4]
#  [ 5  6]
#  [ 7  8]
#  [ 9 10]
#  [11 12]]
print(array_a.shape) # (6, 2)


array_a = array_a.reshape(-1, 6)
print(array_a)
# [[ 1  2  3  4  5  6]
#  [ 7  8  9 10 11 12]]
print(array_a.shape) # (2, 6)

 

배열 데이터 조회 

인덱싱

요소 조회

  • 배열[행인덱스, 열인덱스]
  • 배열[행인덱스][열인덱스]

행 조회

  • 배열[행 인덱스. :]
  • 배열[행 인덱스]
  • 배열[[행1, 행2]]
  • 배열[[행1, 행2], :]

 

요소 조회 예제 코드

import numpy as np

list_a = [[1,2,3], [4,5,6], [7,8,9], [10,11,12]]

array_a = np.array(list_a)

print(array_a[0,0]) # 1
print(array_a[0][0]) # 1

 

행 조회 예제 코드

import numpy as np

list_a = [[1,2,3], [4,5,6], [7,8,9], [10,11,12]]

array_a = np.array(list_a)

print(array_a[0, :]) # [1 2 3]
print(array_a[1]) # [4 5 6]
print(array_a[[0,1]]) # [[1 2 3] [4 5 6]]
print(array_a[[0,1], :]) # [[1 2 3] [4 5 6]]

 

 

슬라이싱

  • 배열[시작:끝]
  • 배열[행인덱스, 시작:끝]
  • 배열[시작:끝, 시작:끝]
import numpy as np

list_a = [[1,2,3], [4,5,6], [7,8,9], [10,11,12]]

array_a = np.array(list_a)

print(array_a[0:2]) # [[1 2 3] [4 5 6]]
print(array_a[0, 0:2]) # [1 2] 
print(array_a[0:2, 0:2]) # [[1 2] [4 5]]

 

 

집계 함수

sum(), mean(), std() 모두 옵션없이 사용하면, 전체 데이터에 대한 집계가 계산된다.

  • numpy.sum() : 합계
  • numpy.mean() : 평균
  • numpy.std() : 표준편차

 

option

  • axis = 0 : 행 방향 집계
  • axis = 1 : 열 방향 집계
import numpy as np

list_a = [[1,2,3], [4,5,6], [7,8,9], [10,11,12]]
array_a = np.array(list_a)

# no option

# numpy.sum()
# 함수로서 사용
print(np.sum(array_a)) # 78
# 메소드로서 사용
print(array_a.sum()) # 78

# numpy.mean()
# 함수로서 사용
print(np.mean(array_a)) # 6.5
# 메소드로서 사용
print(array_a.mean()) # 6.5

# numpy.std()
# 함수로서 사용
print(np.std(array_a)) # 3.452052529534663
# 메소드로서 사용
print(array_a.std()) # 3.452052529534663

# axis=0
# numpy.sum()
print(array_a.sum(axis=0)) # [22 26 30]

# numpy.mean()
print(array_a.mean(axis=0)) # [5.5 6.5 7.5]

# numpy.std()
print(array_a.std(axis=0)) # [3.35410197 3.35410197 3.35410197]


# axis=1
# numpy.sum()
print(array_a.sum(axis=1)) # [ 6 15 24 33]

# numpy.mean()
print(array_a.mean(axis=1)) #  2.  5.  8. 11.]

# numpy.std()
print(array_a.std(axis=1)) # [0.81649658 0.81649658 0.81649658 0.81649658]

 

가장 큰(작은) 값의 인덱스 반환 

  • numpy.argmax(array, axis)
  • numpy.argmin(array, axis)
  • axis 생략: 전체 데이터
  • axis 0 : 열 기준 큰 값
  • axis 1 : 행 기준 큰 값
import numpy as np

list_a = [[1,2,3], [4,5,6], [7,8,9], [10,11,12]]
array_a = np.array(list_a)

# 전체 데이터 중 큰 값 인덱스 조회
print(np.argmax(array_a)) # 11

# axis = 0
# 열 별로 가장 큰 값의 인덱스 조회
print(np.argmax(array_a, axis=0)) # [3 3 3]

# axis = 1
# 행 별로 가장 큰 값의 인덱스 조회
print(np.argmax(array_a, axis=1)) # [2 2 2 2]

# 전체 데이터 중 작은 값 인덱스 조회
print(np.argmin(array_a)) # 0

# axis = 0
# 열 별로 가장 작은 값의 인덱스 조회
print(np.argmin(array_a, axis=0)) # [0 0 0]

# axis = 1
# 행 별로 가장 작은 값의 인덱스 조회
print(np.argmin(array_a, axis=1)) # [0 0 0 0]

 

조건에 따라 값 지정하기 :: numpy.where

numpy.where(조건문, 참일 때 값, 거짓일 때 값)

import numpy as np

list_a = [1,2,3,4,5,6,7]
array_a = np.array(list_a)

array_a = np.where(array_a < 4, 1, 0)
print(array_a) # [1 1 1 0 0 0 0]
728x90

'Language > Python' 카테고리의 다른 글

[Pandas] 시계열 데이터 처리  (0) 2024.03.01
[Pandas] 데이터분석을 위한 데이터 전처리  (2) 2024.03.01
[Pandas] Pandas 기초  (0) 2024.03.01
[Python] List, Dictionary  (0) 2024.02.28
  • 목차
    • List
    • Dictionar

List

[생성]

1. 대괄호

# list_name = [?, ?, ?] 방식으로 선언
# ex)
a = [1,2,3] # 원소로 숫자만
b = [1,"2",3] # 원소로 숫자 + 문자형

 

2. range() 함수

2-1. range(2): 0~1까지

a = list(range(2))
print(a) # [0, 1]

 

2-2. range(1, 5): 1~4까지

a = list(range(1, 3))
print(a) # [1, 2]

 

2-3. range(0,7,2): 0부터 6까지 2씩 증가

a = list(range(0, 7, 2))
print(a) # [0, 2, 4, 6]

 

 

[조회]

1. 인덱스 조회

# 조회는 index로 조회한다.
# index는 0부터 시작
a = [1,2,3]
print(a[0]) # 1
print(a[1]) # 2
print(a[2]) # 3
print(a[3]) # error
print(a[-1]) # 3

 

2. 인덱스 범위 조회

리스트 이름[시작 인덱스 : 끝 인덱스]

시작 인덱스는 포함하고, 끝 인덱스전까지 조회한다.

시작 인덱스 생략: 0번 인덱스 부터

끝 인덱스 생략: 마지막 인덱스 까지

a = [1,2,3,4,5]
print(a[:]) # [1,2,3,4,5]
print(a[:-2]) # [1,2,3]
print(a[2:-2]) # [3]

 

[수정]

1. 값 추가 (append, extend, insert)

1. append(value)

리스트의 제일 끝에 값을 추가

# 값 한개 추가
a = [1,2,3,5]
print(a) # [1,2,3,5]

# 리스트에 리스트 추가
a.append([7,8,9])
print(a) # [1,2,3,5,6,[7,8,9]]

 

2. extend(list)

리스트에 다른 리스트의 원소를 모두 이어붙이고 싶을 때

a = [1,2,3]
b = [4,5,6]

a.extend(b)
print(a) # [1,2,3,4,5,6]

 

3. insert(index, value)

원하는 위치에 특정 값 넣기

리스트이름.insert(index, value)

a = [1,2,4,5,6,7]
a.insert(2,3)
print(a) # [1,2,3,4,5,6,7]

2. 값 수정

리스트이름[수정하고싶은 인덱스] = 수정할 값

a = [1,2,4]
print(a) # [1,2,4]

a[2] = 3
print(a) # [1,2,3]

 

3. 값 삭제(del, pop)

1. del list[index]

del 리스트이름[index]

원하는 인덱스 값을 리스트에서 삭제

a = [1,2,3,4,5]
print(a) # [1,2,3,4,5]

del a[3]
print(a) # [1,2,3,5]

 

2. pop(index)

리스트이름.pop(index)

원하는 인덱스 위치의 값을 삭제

a = [1,2,3,3,4,5]
print(a) # [1,2,3,3,4,5]

a.pop(2)
print(a) # [1,2,3,4,5]

 

 

2. remove(value)

특정 값을 리스트에서 삭제

중복되는 값이 있는 경우 더 앞에 있는 값을 삭제

a = [1,2,3,4,3,5]
a.remove(3)
print(a) # [1,2,4,3,5]

Dictionary

[생성]

Dictionary는 key와 value의 쌍으로 이루어져 있다.

생성시 리스트와 다르게 { } 중괄호를 사용한다.

 

# dict = {"key" : "value}
student = {"James": 20, "Kevin": 21} # key: 문자열, value: 숫자
print(student) # {'James': 20, 'Kevin': 21}

score = {30242: 100, 324215: 90} # 학번 : 성적 -> key: 숫자, value: 숫자
print(score) # {30242: 100, 324215: 90}

 

[조회]

조회할때는 key를 이용하여 조회한다.

dictionary['key']

student = {"James": 20, "Kevin": 21} 
print(student["James"]) # 20

 

 

[수정]

1. 값 추가/수정

리스트 값 수정하는 것과 비슷하다. 대괄호안에 인덱스 대신 key를 넣어주면 된다.

dictionary["key"] = new_value 

student = {"James": 20, "Kevin": 21}
student["James"] = 22
print(student["James"]) # 22

 

3. 값 삭제

리스트 요소 삭제의 del과 문법이 동일하다.

del dictionary['key'] 

student = {"James": 20, "Kevin": 21}
del student["Kevin"]
print(student) # {"James": 20 }
728x90

'Language > Python' 카테고리의 다른 글

[Pandas] 시계열 데이터 처리  (0) 2024.03.01
[Pandas] 데이터분석을 위한 데이터 전처리  (2) 2024.03.01
[Pandas] Pandas 기초  (0) 2024.03.01
[Numpy] Numpy 기초  (0) 2024.02.29

 

Network 구조

 

Socket ⇒ TCP를 User mode Application에서 접근할 수 있도록 파일 형식으로 추상화한 인터페이스가 속해진 것.

  • Port Number ⇒ Transport 식별자
  • IP Address ⇒ Host 식별자
  • MAC Address ⇒ NIC 식별자
  • IP Address ⇒ Host 식별자
    • 하나의 컴퓨터는 여러개의 IP Address를 가질 수 있다.
    • IP는 NIC 하나에 여러개를 할당받을 수 있다. (바인딩)
  • Host
    • Network에 연결되어 있는 Computer
    1. Network 자체를 이루는 주체(Switch)
    2. Network를 이용하는 주체 (Host, End Point, Client, Peer, Server)
  • Switch
    • Router (L3 Switch)
      • 길(경로)를 찾기 위해 Switching 한다.
    • F/W (Firewall) 방화벽
    • IPS

 

IPv4

IP 주소는 Host에 대한 식별자이다.

  • IP Adderss
    • v4
      • 32 bit
      • 경우의 수 2^32
      • ex) 127.0.0.1
    • v6
      • 128 bit
      • 경우의 수 2^128
  • IP Address에서 NetworkId길이가 몇인지 나타내는 것이 SubnetMask이다.
    • 예제)
    • IP Address 192.168.219.100
    • subnetmask 255.255.255.0
    • 192 → 1100 0000
    • 255 → 1111 1111
    • ip address와 subnet mask를 bit and 연산을 한 결과를 구한다.
    • 192.168.219.0
    • 0 ⇒ Host ID
    • 192.168.219 ⇒ Network ID
    • 표기 ⇒ 192.168.219.100/24 ⇒ 24bit가 NetworkID, 8bit가 Host ID라는 의미

 

Port Number

Port Number

  • 16 bit
  • 2^16 -2 가지의 경우의 수
    • 0과 65535는 사용하지 않음.
  • 각 Process는 Network에 접속하려고 하면 Socket이 열리게 된다. Socket은 TCP 추상화한 인터페이스 정보를 포함하기 때문에 Port번호를 갖게 되는데, 이 Port번호는 각 Process마다 서로 중복되지 않게 할당되게 된다.
  • Network에서 어떠한 Packet을 받아온다고 가정하면 NIC → IP를거쳐 TCP에서 Port번호를 식별해 해당 Port번호가 할당된 Process에게 Data를 전달한다.

 

Switch

어떤 Packet이 목적지를 향해 이동하려고 한다. 이때의 과정을 쉽게 설명하면 다음과 같다.

  1. 중간 지점들은 모두 Router이다.
  2. 각각의 Router들은 Routing Table을 갖는다.
  3. Router에서는 Routing Table을 기준으로 Packet을 어떤 Router로 보낼지를 결정한다.

 

Network Data 단위

TCP ⇒ Segmentation

IP ⇒ Packet

NIC ⇒ Frame

예시)

  • Application에서 문서작업을 함
  • ⬇️  Stream 데이터 전송
  • TCP: Stream 데이터를 MSS 단위로 자름 ( MSS는 MTU에 의해서 결정된다. )
  • ⬇️  Segmentation 전송
  • IP: Segmentation을 포장함
  • ⬇️  Packet 전송
  • H/W: Packet을 실어 나름 ( Frame )

 

참고 영상

 

728x90

+ Recent posts