Python

[Python] DataFrame

SangRok Jung 2022. 10. 6. 13:00
반응형

DataFrame 


▶ 라이브러리를 불러옵니다.

import numpy as np
import pandas as pd

 

 

 

 

▶ DataFrame 생성

데이터 프레임명 = pd.DataFrame()
df1 = pd.DataFrame([[15, '남', '덕영중'], [17, '여', '수리중']],
                      index=['준서', '예은'],
                      columns=['나이', '성별', '학교'])

 

 

 

 

▷ index, column 수정

df1.index = ['학생1','학생2']
df1.columns = ['연령','남녀','소속']

 

 

 

 

 

 

▶ 사전형 데이터를 불러와 DataFrame 생성

exam_data = {'이름':['서준','우현','인아'],
             '수학':[90,80,70],
             '영어':[98,89,95],
             '음악':[85,95,100],
             '체육':[100,90,90]}
             
df2 = pd.DataFrame(exam_data)

 

 

 

 

 

 

▶ 컬럼 및 데이터 추가

DataFrame객체 [추가하려는 컬럼명] = 데이터 값
df2['국어'] = 80

 

 

 

 

▷ 각 열마다 데이터 지정

df2['국어'] = 80, 60, 50

 

 

 

 

 

▶ row 추가

DataFrame 객체.loc['새로운 행 명'] = 데이터 값 (또는 배열) 또는 기존의 행

 

 

 

 

 

▶ 원소 값 변경

DataFrame 객체의 일부분 또는 원소 선택 = 변경하려는 값
# iloc를 사용
df6.iloc[0][3] = 100

# loc를 사용
df6.loc["서준"]['체육'] = 10 # 좋은 방식이 아닙니다. 에러도 발생하지 않으면서 원하지 않는 결과를 도출합니다.
# 서준의 음악 체육 점수 변경
# iloc를 사용
df6.iloc[0][2:3] = 50
# loc를 사용
df6.loc['서준', ['음악', '체육']] = 50

# 음악 90, 체육 60점 변경
# loc를 사용
df6.loc['서준', ['음악', '체육']] = 90, 60

 

 

 

 

 

 

 

.copy()


복사 당시의 데이터 프레임의 상태를 복사하는 깊은 복사.

복사본이 자신만의 데이터/Index를 갖게한다.

붙여넣을 데이터 프레임 = 복사할 데이터 프레임.copy()

 

 

 

 

 

 

.rename()


  • index, column을 수정 합니다.
  • inplace의 값을 True로 설정해야 원본 데이터의 값이 변경됩니다.

 

df1.rename(columns={'나이':'연령','성별':'남녀','학교':'소속'}, inplace=True)
df1.rename(index={'준서':'학생1','예은':'학생2'}, inplace=True)

rename 전
rename 후

 

 

 

 

loc & iloc


▶ loc

  • location의 약어로, 인간이 읽을 수 있는 label 값으로 데이터에 접근합니다.
  • 데이터 프레임의 행이나 컬럼에 label이나 boolean array로 접근합니다.

 

 

▶ iloc

  •  integer location의 약어로, 컴퓨터가 읽을 수 있는 indexing 값으로 데이터에 접근합니다.
  • 데이터프레임의 행이나 컬럼에 인덱스 값으로 접근합니다.

 

 

 

 

 

▶ 데이터 선택

df6.iloc[0][3] = 100
df6.loc["서준"]['체육'] = 10 # 좋은 방식이 아닙니다. 에러도 발생하지 않으면서 원하지 않는 결과를 도출합니다.
# 서준의 음악 체육 점수 변경
df6.iloc[0][2:3] = 50
df6.loc['서준', ['음악', '체육']] = 50

# 음악 90, 체육 60점 변경
df6.loc['서준', ['음악', '체육']] = 90, 60

 

 

 

 

 

 

row, columns의 위치 바꾸기 (전치)


데이터프레임의 행과 열을 바꿉니다.

 

 

▶ 구문

df6.transpose()
df6.T

 

 

 

 

 

 

 

 

set_index()


특정 컬럼을 인덱스로 설정합니다.

 

 

▶ 구문

DataFrame객체.set_index(["컬럼"] 또는 "컬럼")

 

 

 

 

 

reindex()


  • 데이터프레임의 행 인덱스를 새로운 배열로 재지정 합니다.
  • 기존 객체를 변경하지 않고, 새로운 데이터프레임 객체를 반환합니다.
  • 기존 데이터프레임에 존재하지 않는 인덱스가 새롭게 추가되는 경우, 그 인덱스의 값은 NaN값이 입력됩니다.
  • 인자값 fill_value에 값을 저장할 수 있습니다.

 

 

▶ 구문

DataFrame객체.reindex(새로운 인덱스 배열)

 

 

▶ 예문

dict_data = {'c0':[1, 2, 3], 
             'c1':[4, 5, 6], 
             'c2':[7, 8, 9], 
             'c3':[10, 11, 12], 
             'c4':[13, 14, 15]}

df = pd.DataFrame(dict_data, index=['r0', 'r1', 'r2'])

ndf = df.reindex(['r0', 'r1', 'r2', 'r3', 'r4'], fill_value=0 )

 

 

 

 

 

 

 

 

 

 

reset_index()


행 인덱스 초기화

  • 정수형 위치 인덱스로 초기화 합니다.
  • 기존 행 인덱스는 컬럼으로 이동, 새로운 데이터프레임 객체를 반환합니다.
  • 정수형 위치 인덱스로 초기화.

 

DataFrame객체.reset_index()

 

 

 

 

 

 

 

 

 

 

sort_index()


  • 행 인덱스를 기준으로 데이터프레임 정렬.
  • ascending 옵션을 사용하여 오름차순 또는 내림차순으로 설정.
  • 새롭게 정렬된 데이터 프레임 객체를 반환.

 

DataFrame.sort_index()

 

ndf.sort_index()
ndf.sort_index(ascending = False)

 

 

 

 

 

 

 

 

 

sort_values()


  • 특정 컬럼을 기준으로 데이터프레임 정렬.
  • 새롭게 정렬된 데이터프레임 객체를 반환.
  • ascending 옵션을 사용하여 오름차순 또는 내림차순으로 설정.

 

 

▷ 기본 구문

DataFrame.sort_values()

 

 

▷ 예문

ndf.sort_values(by = 'c1')

 

 

 

 

 

 

 

 

 

판다스 객체 산순열산의 내부 3단계 프로세스


  1. 로우/컬럼 인덱스 기준 모든 원소 정렬.
  2. 동일한 위치에 있는 원소끼리 1:1 대응.
  3. 1:1 대응이 되는 원소끼리 연산 처리. 이때 대응되는 원소가 없을시 Nan

 

 

 

 

 

 

 

 

 

 

시리스 VS 숫자


Series + 연산자 + Number

 

 

 

▶ 딕셔너리 데이터로 시리즈 생성후 과목별 점수 200으로 나누기

student1 = pd.Series({"국어" : 100, 
                     "영어" : 80,
                     "수학" : 90})

student1 / 200

# 국어    0.50
# 영어    0.40
# 수학    0.45
# dtype: float64

 

 

 

 

 

 

시리스 VS 시리즈


시리즈와 시리즈 사이에 사칙연산 처리.

같은 인덱스를 가진 원소끼리 계산.

해당 인덱스에 연산 결과를 매칭하여 새 시리즈를 반환.

 

 

▶ 딕셔너리 데이터로 시리즈 데이터 생성후 "시리즈 +  시리즈" 연산

student1 = pd.Series({"국어" : 100, 
                     "영어" : 80,
                     "수학" : 90})

student2 = pd.Series({"수학" : 100, 
                     "국어" : 80,
                     "영어" : 90})

student1 + student2

# 국어    180
# 수학    190
# 영어    170
# dtype: int64

 

 

 

 

 

 

 

▶ NaN 값이 있는 시리즈의 산술연산

  • 연산의 대상인 데이터가 존재하지 않기 때문에 NaN으로 처리

 

 

 

 

 

▶ 시리즈 연산 데이터 프레임 생성

st1 = pd.Series({'국어':np.nan, '영어':80, '수학':90})
st2 = pd.Series({'수학':80, '국어':90})

addition = st1 + st2
subtraction = st1 - st2
multiplication = st1 * st2
division = st1 /st2

result = pd.DataFrame([addition, subtraction, multiplication, division],
                     index=['덧셈', '뺄셈', '곱셈', '나눗셈'])

result

 

 

 

 

 

 

▶ 연산 메서드 fill_value 옵션

객체 사이에 공통 인덱스가 없는 경우 fill_value 옵션을 통해 연산 NaN을 회피.

 

st1 = pd.Series({'국어':np.nan, '영어':80, '수학':90})
st2 = pd.Series({'수학':80, '국어':90})

add1 = st1.add(st2, fill_value = 0)
min1 = st1.sub(st2, fill_value = 0)
mul1 = st1.mul(st2, fill_value = 0)
div1 = st1.div(st2, fill_value = 0)

df9 = pd.DataFrame([add1, min1, mul1, div1], index = ["덧셈", "뺄셈", "곱셈", "나눗셈"])

 

 

 

 

 

데이터프레임 연산


데이터 프레임은 여러 시리즈가 모인것으로, 시리즈 연산을 확장하는 개념.

먼저 행/열 인덱스를 기준으로 정렬 후 1:1 대응되는 원소끼리 연산.

 

 

 

▶ 데이터프레임 VS 숫자

  • 데이터프레임에 어떤 숫자를 더할 시 모든 원소에 숫자를 더한다.
  • 기존 데이터프레임의 형태를 그대로 유지한 채, 원소 값만 새로운 값으로 바뀐다.
DataFrame + 연산자 + number

 

 

▷ titanic 데이터셋에서 age, fare 컬럼을 선택하여 데이터프레임을 생성하고 10을 더한다.

import seaborn as sns
titanic = sns.load_dataset("titanic")
titanic.loc[:, ['age', 'fare']] + 10

* titanic 데이터셋 : Seaborn 라이브러리에서 제공하는 데이터셋, 타이타닉호 탑승자에 대한 인적사항과 구조 여부 등을 정리한 자료.

 

 

 

 

 

▶ 데이터프레임 VS 데이터프레임

 

df_t = sns.load_dataset("titanic").loc[:, ['age', 'fare']]

df_t2 = df_t + 10

df_t2 - df_t

반응형

'Python' 카테고리의 다른 글

[Python] Boolean Indexing  (0) 2022.10.06
[Python] 컬럼 순서 변경  (0) 2022.10.06
[Python] Function Mapping  (0) 2022.10.06
[Python] TimeSeries  (0) 2022.10.06
[Python] 정규화  (0) 2022.10.06