728x90
반응형
SMALL

안녕하세요! 오늘은 Pandas를 사용하여 데이터를 복사하는 방법에 대해 설명드리겠습니다. 때로는 데이터를 복사해 작업을 진행해야할 때가 있는데요. 이때 주의해야할 점이 있습니다. 바로 원본 데이터가 훼손되지 않도록 하는 것입니다. 그 방법에 대해 알아봅시다.

import pandas as pd

# 데이터 불러오기
df = pd.read_csv('http://bit.ly/ds-korean-idol')

# 이렇게 저장하게되면 같은 메모리 주소를 가리키게 됨
new_df = df
new_df['이름'] = '김사과'
new_df.head()

# 원본 데이터 까지 훼손 된다.
df

위와 같이 데이터를 복사하면 메모리 주소를 공유하기 때문에 원본 데이터까 훼손됩니다. 이를 방지하기 위해 복사한 데이터프레임을 새로운 메모리 주소에 할당해야 합니다.

#시 원본 데이터 복사
df = pd.read_csv('http://bit.ly/ds-korean-idol')

# 메모리 주소 확인
print(hex(id(new_df)))
print(hex(id(df)))

# copy() 함수 사용하여 새로운 메모리 주소에 할당
copy_df = df.copy()

# 메모리 주소 확인
print(hex(id(copy_df)))
print(hex(id(df)))

# 이제 원본 데이터는 달라지지 않습니다.
copy_df['이름'] = '반하나print(df.head())
copy_df.head()

위에서처럼 copy() 함수를 사용하면 새로운 메모리 주소에 데이터프레임을 할당할 수 있습니다. 이렇게 하면 원본 데이터가 훼손되지 않고, 새로운 데이터프레임에서 작업을 진행할 수 있습니다.

오늘은 Pandas에서 데이터 복사 방법에 대해 알보았습니다. 원본 데이터를 보호하면서 작업을 진행하려면 반드시 copy() 함수를 사용하는 것을 기억해두세요! 다음 포스팅에서 또 다른 유용한 팁을 들고 찾뵙겠습니다. 감사합니다!

728x90
반응형
LIST
728x90
반응형
SMALL
  1. 판다스 (Pandas)
  • 웨스 맥키니 가 개발한 라이브러리
  • 데이터 작업을 쉽고 직관적으로 할 수 있도록 설계된 빠르고 유연한 데이터 자료 구조(데이터 프레임)를 제공하는 모듈
 
!pip install pandas
  • 라이브러리 임포트```python import pandas as pd
 
1-1. Series와 DataFrame
- 2차원 표 데이터를 데이터프레임이라고 한다면, 1차원 표 데이터는 시리즈다.
- 표의 데이터 부분을 values라고 부름
 표의 행 이름을 index라고 부름
- 표의 열 이름을 columns라고 부름
- 시리즈는 values와 index로 이루어져 있고, 데이터 프레임은 values, index, columns로 이루어져 있음
- 데이터프레임과 시리즈는 value는 넘파이의 ndarray 기반

```python
data1 = [[67, 93 91],
         [75, 69, 96],
         [85, 81, 82],
         [62, 70, 75],
         [98, 45, 87]]

#idx
idx1 = ['김사과', '반하나', '오렌지', '이메론 '베에리']

#columns
col1 = ['국어', '영어', '수학']
  • 데이터 프레임 생성
# DataFrame(데이터, 인덱스, 컬럼)
pd.DataFrame(data1)

# DataFrame(데이터, 인덱스, 컬럼)
pd.DataFrame(data1, idx1)

# DataFrame(데이터 인덱스, 컬럼)
df1 = pd.DataFrame(data1, idx1, col1)
# pd.DataFrame(data = data1, index = idx1, columns = col1)
  • 데이터 프레임 확인
df1
  • 값 확인
df1.values
  • 인덱스 확인
df1.index
  • 열 확인
df1.columns
  • 1차원 데이터(Series) 생성
data2 = [67, 75,85, 62, 98]
# Series(데이터, 인덱스)
print(pd.Series(data2))
pd.Series(data2, idx1)
 
se1 = pd.Series(data2, idx1)
se1.values
 
se1.index
  • 딕셔너리를 사용하여 데이터 프레임을 생성
dic1 = {
    '국어': [67, 75, 75, 62, 98],
    '영어': [93, 69, 81, 70, 45],
    '수학': [91, 96, 82, 75, 87]
}

df2 = pd.DataFrame(data=dic1, index = idx1)
  • 데이터 프레임 확인
df2
  1. CSV 파일 다루기
  • 데이터를 쉼표로 구분 파일
  • 엑셀로 로딩할 수 있지만 쉼표로 구분된 csv가 더 가볍기 때문에 데이터를 많이 사용
  • 공공데이터포털에서도 csv 포멧의 파일을 제공
# pd.read_csv(CSV파일, 인코딩방법)
pd.read_csv('korean-idol.csv```

- 파일 경로를 사용하여 파일 읽기

```python
pd.read_csv('/content/drive/MyDrive/Colab Notebooks/수업/데이터 분석(파이썬)/korean-idol.csv')
  • 웹 주소에서 파일 읽기
pd.read_csv('http://bit.ly/ds-korean-idol')
  1. 엑셀 파일 읽어오기
python
pd.read_excel('/content/drive/MyDrive/Colab Notebooks/수업/데이터 분석(파이썬)/korean-idol.xlsx')
  1. 데이터프레임 기본 정보 알아보기
python
df = pd.read_csv('http://bit.ly/ds-korean-idol')
python
type(df)
  • 기본적인 행(row), 열(column)의 정보와 데이터 타입을 반환
python
df.info()

4-1. 열(column) 다루기

python
df.columns
  • 새로운 열 이름 정의
python
new_column = ['name',group', 'company', 'gender', 'birthday', 'height', 'blood', 'brand']
  • 열 이름 변경
python
df.columns = new_column
df

4-2. 통계 정보 알아보기

  • 통계 정보 출력
python
df.describe()
python
df.describe(include=object)

4-3. 형태(shape)

python
df.shape

4-4. 원하는 개수의 데이터 보기

  • 상위 5개 row를 출력
python
df.head()
  • 상위 n개의 row를 출력
python
df.head(7)
  • 하위 5개의 row를 출력
python
df.tail()
  • 하위 n개의 row를
python
df.tail(1)

4-5. 정렬하기

python
# 인덱스로 오름차순 정렬
df.sort_index()
python
# 인덱스로 내림차순 정렬
df.sort_index(ascending=False)
python
# 값으로 오름차순 정(by='기준')
df.sort_values(by='height')
python
# 값으로 내림차순 정렬(by='기준', ascending=False)
df.sort_values(by='height', ascending=False)
python
# NaN을 가장로 올리기(기본값이 last)
df.sort_values(by='height', na_position='first')
python
# NaN을 가장 위로 올리기(기본값이 last)
df.sort_values(by='height', ascending=False ,na_position='first')
python
# 1차 정렬: 키(내림차순), 2차 정렬: 브랜드(오름차순)
df.sort_values(by=['height 'brand'], ascending=[False, True], na_position='first')
  1. 데이터 다루기
python
df.head()
python
df['blood']
python
type(df['blood'])
python
df.blood

5-1 범위 선택

python
df.head(3)
python
df[:3]
  1. loc 인덱싱
python
# 레이블(이름) 인덱싱, 행과 열 모두 인덱싱 슬라이싱이 가능
df.loc[:, 'name']
python
# 인덱스 2부터 5까지의 데이터를 가져온다.(5를 포함)
df.loc[2:5, 'name']
python
# 여러 개의 열을 가져올 때는 리스트를 이용한다.
df.loc[:, ['name', 'gender','height']]
python
# 슬라이싱도 가능하다. 
df.loc[3:8, 'name':'gender']
  1. iloc 인덱싱
python
# iloc는 index로 인덱싱, 행과 열 모두 인덱싱과 슬라이싱 가능
df.iloc[:, [0, 2]]
python
# 0부터 2번 열까지 슬라이싱(2번 열은 포함하지 않음)
df.iloc[:, 0:2]
python
df.iloc[1:3, 2:4]
  1. Boolean 인덱싱
python
# 키가 180 이인 경우
df['height'] >= 180
python
# 키가 180 이상인 데이터만 추출
df[df['height'] >= 180]
python
# 키가 180 이상인 사람의 이름만 추출
df['name'][df['height'] >= 180]
python
# 리스트로 여러 행을 가져온다.
df[['name','gender','height']][df['height'] >= 180]
  1. isin
  • 정의한 리스트에 있는 데이터를 색인하려는 경우 사용하는 함수
python
company = ['플레디스', 'SM']
python
df['company'].isin(company)
python
df[df['company'].isin(company)]
python
df.loc[df['company'].isin(company)]

결측값(Null) 처리하기

Pandas에서는 결측값을 NaN(Not a Number)로 표기 된 것은 모두 결측값으로 취급합니다.

# 총 entries 값과 갯수가 다르면 결측값이 있는지 확인 가능
df.info()

# 결측값이 있는 행을 선택하기
df.isnull()
df.isna()

# 결측값이 있는 특정 컬럼 확인하기
df["group"].isnull()

# 결측값이 있는 행 얻기
df[df["group"].isnull()]

# 결측값이 없는 데이터만도 추출이 가능하다
df[df["group"].notnull()]

# 결측값이 있는 컬럼의 이름만 얻기
df[df["group"].isnull()]['name

 

728x90
반응형
LIST
728x90
반응형
SMALL

Numpy

Numpy는 수학, 과학 계산용 패키지입니다. 자료구조를 제공하고 있으, 그 중 ndarray는 파이썬의 list보다 속도가 더 빠름과 적은 메모리를 사용한다는 특징이 있습니다.

ndarray

ndarray는 Numpy의 핵심 구조로, Numpy에서 사용되는 데이터 배열입니다. 파이썬의 list를 ndarray로 변환하는 방법은 아래와 같습니다.

python
import numpy as np

list1 = [1, 2, 3, 4]
list2 = [[1, 2, 3, 4], [5, 6, 7, 8]]

# 리스트를 ndarray로 변환
ndarr1 = np.array(list1)
ndarr2 = np.array(list2)

print(ndarr1)
# [1 2 3 4]

print(ndarr2)
'''
[[1, 2, 3, 4],
 [5, 6, 7, 8]]
'''

ndarray의 data type

ndarray는 list와 달리 1개 단일 데이터 타입만 허용합니다.

python
import numpy as np

# 데이터 타입이 int인 ndarray
ndarr1 = np.array([1, 2, 3, 4])
print(ndarr1.dtype) # int64

# 데이터 타입이 float인 ndarray
ndarr2 = np.array([1, 2, 3.14, 4])
print(ndarr1.dtype) # float64

# 데이터 타입이 string인 ndarray
ndarr3 = np.array(['1', '2', '3.14', 'True'])
print(ndarr3.dtype) # <U4

ndarray 슬라이싱

ndarray의 슬라이싱은 리스트의 슬라이싱과 비슷합니다.

python
import numpy as np

ndarr1 = np.array(['🍎','🍒','🍓','🍎','🥭'])

# 인덱싱
print(ndarr1[0]) # 🍎
print(ndarr1[4]) # 🥭
print(ndarr1[-1]) # 🥭
print(ndarr1[-2]) # 🍎

# 슬라이싱
print(ndarr1[0:3]) # ['🍎' '🍒' '🍓']
print(ndarr1[2:]) # ['🍓' '🍎' '🥭']
print(ndarr1[:3]) # ['🍎' '🍒' '🍓']

Fancy 인덱싱

슬라이싱 대신 여러 특정한 인덱스의 값을 동시에 얻을 수 있는 Fancy 인덱싱을 사용할 수 있습니다.

python
import numpy as np

ndarr1 = np.array([10, 15, 2, 8, 20, 90, 85, 44, 23, 32])
idx = [2, 5, 9]
ndarr1[idx] # [2, 90, 32]

Boolean 인덱싱

조건에 대한 필터링을 통해 Boolean 값을 이용한 색인을 사용할 수 있습니다.

python
import numpy as np

ndarr1 = np.array(['🍎','🍒','🍓','🍎','🥭'])

selValue = [True, False, True, True, False]
ndarr1[selValue] # ['🍎', '🍓', '🍎']

ndarr2d = np.array1,2,3,4],
                    [5,6,7,8],
                    [9,10,11,12]])

print(ndarr2d[ndarr2d > 7]) # [ 8  9 10 11 12]

arange

순차적인 값을 생성할 때 사용하는 arange 함수는 range 함수와 유사합니다.

python
import numpy as np

arr2 = np.arange(1, 11)

for i in arr2:
    print(i, end=" ") # 1 2 3 4 5 6 7 8 9 10```

### sort

`sort` 함수를 이용하면 ndarray를 정렬할 수 있습니다.

```python
import numpy as np

ndarr1 = np.array([1, 10, 5, 7, 2, 4, 3, 6, 8, 9])
np.sort(ndarr1) # [1, 2, 3, 4, 5, 6, 7, 8, 9, 10]

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

# 행 정렬
print(np.sort(nd2d, axis=0))
'''
[[ 3  1  4  2],
 [ 5  6  7  8],
 [11 10 12  9]]
'''

# 열 정렬
print(np(ndarr2d, axis=1))
'''
[[ 9 10 11 12],
 [ 1  2  3  4],
 [ 5  6  7  8]]
'''

# 열 정렬 내림차순
print(np.sort(ndarr2d, axis=1)[:,::-1])
'''
[[12 11 10  9],
 [ 4  3  2  1],
 [ 8  7  6  5]]
'''
``### 연산자를 이용한 계산

덧셈, 뺄셈, 곱셈, 나눗셈은 shape가 같아야 하며, 같은 position끼리 연산합니다.

```python
a = np.array([[1,2,3],
              [2,3,4],])

b = np.array([[3,4,5],
              [1,2,3]])

print(a+b) # [[4 6 8], [3 5 7]]
print(a-b) # [[-2 -2 -2], [ 1  1  1]]
print(a*b) # [[ 3  8 15], [ 2  6 ]]
print(a/b) # [[0.33333333 0.5        0.6       ], [2.         1.5        1.33333333]]

또한 내적(dot product)은 맞닿는 shape가 같아야 하며, 내적은 떨어져 있는 shape가 결과 행렬이 됩니다.

python
a = np.array([[1,2,3],
              [1,2,3],
              [2,3,4]])

b = np.array([[1,2],
              [3,4],
              [5,6]])

print(np.dot(a,b))
'''
[[22 28]
 [22 28]
 [31 40]]
'''

 

728x90
반응형
LIST
728x90
반응형
SMALL

express.static에 public 폴더를 등록하여 

express 모듈을 사용시 자동으로 접근할수 있게 함

728x90
반응형
LIST

'JavaScript > Node.js' 카테고리의 다른 글

Node.js - routing  (0) 2023.05.02
Node.js - error-handling  (0) 2023.05.02
Node.js - post  (0) 2023.05.02
Node.js - get  (0) 2023.04.24
Node.js - express  (0) 2023.04.24
728x90
반응형
SMALL

변수로 express를 저장하여 express안의 함수를 .클래스의 메소드로 사용

다른곳에 모듈로 만들어놓고 import하여 코드를 깔끔하게 작성

728x90
반응형
LIST

'JavaScript > Node.js' 카테고리의 다른 글

Node.js - public  (0) 2023.05.02
Node.js - error-handling  (0) 2023.05.02
Node.js - post  (0) 2023.05.02
Node.js - get  (0) 2023.04.24
Node.js - express  (0) 2023.04.24
728x90
반응형
SMALL

express, fs, fs를 프로미스로 임포트

fs.readFile -> 같은경로에 file1.txt파일을 읽어서 에러가 나온다면 404 아니면 data return

file2 경로에서는 try문 안에서 file2.txt를 읽어서 오류처리 catch로

 

 

file3경로로 들어가게되면 

promise로 불러온fs모듈로 file3을 읽고 오류처리

 

async, await로 오류처리

500번 status에 메시지를 추가하여 오류처리

728x90
반응형
LIST

'JavaScript > Node.js' 카테고리의 다른 글

Node.js - public  (0) 2023.05.02
Node.js - routing  (0) 2023.05.02
Node.js - post  (0) 2023.05.02
Node.js - get  (0) 2023.04.24
Node.js - express  (0) 2023.04.24

+ Recent posts