본문 바로가기
Python 파이썬/pandas

pandas ) 자료구조 데이터프레임 DataFrame

by 하이방가루 2022. 3. 14.
728x90
반응형

데이터프레임 DataFrame

#데이터프레임 : 여러 개의 시리즈가 모여서 만들어짐
# 딕셔너리의 키는 컬럼명(시리즈 이름)이 됨
# pandas.DataFrame(딕셔너리, index = 행이름, columns= 열이름)
dict_data = {'c0':[1,2,3],'c1':[0,9,8],'c2':[4,5,6],'c3':[7,8,9]}

df = pd.DataFrame(dict_data) # 데이터프레임 생성
print(df); print()
print(df.columns, df.index); print() # 컬럼명, 인덱스명 출력

df.index = ['a','b','c'] # 인덱스명 변경
print(df); print()
print(df.columns, df.index); print()

df.columns = ['a1','a2','a3','a4'] # 컬럼명 변경
print(df); print()
print(df.columns, df.index)

실행결과

   c0  c1  c2  c3
0   1   0   4   7
1   2   9   5   8
2   3   8   6   9

Index(['c0', 'c1', 'c2', 'c3'], dtype='object') RangeIndex(start=0, stop=3, step=1)

   c0  c1  c2  c3
a   1   0   4   7
b   2   9   5   8
c   3   8   6   9

Index(['c0', 'c1', 'c2', 'c3'], dtype='object') Index(['a', 'b', 'c'], dtype='object')

   a1  a2  a3  a4
a   1   0   4   7
b   2   9   5   8
c   3   8   6   9

Index(['a1', 'a2', 'a3', 'a4'], dtype='object') Index(['a', 'b', 'c'], dtype='object')

데이터프레임 만들기 2

df = pd.DataFrame([[1,2,3],[4,5,6],[7,8,9]],
                  index=['a','b','c'],
                  columns=['c1','c2','c3'])
print(df)

실행결과

   c1  c2  c3
a   1   2   3
b   4   5   6
c   7   8   9​

​행 / 열 이름 지정

# 행 인덱스 / 열 이름 지정
df = pd.DataFrame([[15,'남','덕영중'],[17,'여','수리중']],
                 index=['준서','예은'], columns=['나이','성별','학교'])
print(df)
print()

# 행 일부 이름 변경 df.rename(index={기존 인덱스명:새로운 인덱스명, ...})
# 열 일부 이름 변경 df.rename(columns={기존 컬럼명:새로운 컬럼명, ...})
df.rename(index={'준서':'학생1'},inplace=True) # inplace = True 기존의 데이터 변경
print(df)
print()
df.rename(columns={'성별':'남여'},inplace=True)
print(df)

실행결과

    나이 성별   학교
준서  15  남  덕영중
예은  17  여  수리중

     나이 성별   학교
학생1  15  남  덕영중
예은   17  여  수리중

     나이 남여   학교
학생1  15  남  덕영중
예은   17  여  수리중

행 / 열 삭제

exam_data = {'수학':[90,80,70],'영어':[98,89,95],
            '음악':[85,95,100],'체육':[100,90,90]}
df = pd.DataFrame(exam_data)
print(df)
print()

# 데이터프레임 인덱스명 추가
df.index = ['서준','우현','인아']
print(df); print()

df2 = df.copy() # df2 = df -> 자료 공유
# '우현' 자료를 삭제 (행을 삭제)
df2.drop('우현',inplace=True)
print(df2)
print()
# '수학','체육' 자료 삭제 (열을 삭제)
df2.drop(['수학','체육'],axis=1,inplace=True)
print(df2)

실행결과

   수학  영어   음악   체육
0  90  98   85  100
1  80  89   95   90
2  70  95  100   90

    수학  영어   음악   체육
서준  90  98   85  100
우현  80  89   95   90
인아  70  95  100   90

    수학  영어   음악   체육
서준  90  98   85  100
인아  70  95  100   90

    영어   음악
서준  98   85
인아  95  100

인덱스로 데이터 접근

exam_data = {'수학':[90,80,70],'영어':[98,89,95],
            '음악':[85,95,100],'체육':[100,90,90]}
df = pd.DataFrame(exam_data)
df2 = df.copy()

df2.index = ['서준','우현','민아']
print(df2)
print()

# 인덱스로 데이터 접근
# 행 선택 -> df.loc[인덱스명], df.iloc[인덱스첨자]
print(df2.loc['서준'])
print(df2.iloc[0])
print()

#'서준'과 '우현' 자료를 검색
print(df2.loc[['서준','우현']])
print(df2.loc['서준':'우현']) # 범위선택시 마지막 인덱스 포함
print(df2.iloc[[0,1]])
print(df2.iloc[0:2]) # 범위선택시 마지막 인덱스 미포함
print()

# 컬럼 자료 출력
print(df2['수학'])
print(df2.수학)
print()
# 수학,영어,음악 점수 출력
print(df2[['수학','영어','음악']]) # df2['수학':'음악'] - 더이상 지원안함
print()

# 국어 점수를 100,80,90을 df2에 추가
df2['국어']=[100,80,90]
print(df2)
print()

# 새로운 행 추가 df.loc[인덱스명] = [값, ...]
df2.loc['철수'] = [100,80,98,77,90]
print(df2)

실행결과

    수학  영어   음악   체육
서준  90  98   85  100
우현  80  89   95   90
민아  70  95  100   90

수학     90
영어     98
음악     85
체육    100
Name: 서준, dtype: int64
수학     90
영어     98
음악     85
체육    100
Name: 서준, dtype: int64

    수학  영어  음악   체육
서준  90  98  85  100
우현  80  89  95   90
    수학  영어  음악   체육
서준  90  98  85  100
우현  80  89  95   90
    수학  영어  음악   체육
서준  90  98  85  100
우현  80  89  95   90
    수학  영어  음악   체육
서준  90  98  85  100
우현  80  89  95   90

서준    90
우현    80
민아    70
Name: 수학, dtype: int64
서준    90
우현    80
민아    70
Name: 수학, dtype: int64

    수학  영어   음악
서준  90  98   85
우현  80  89   95
민아  70  95  100

    수학  영어   음악   체육   국어
서준  90  98   85  100  100
우현  80  89   95   90   80
민아  70  95  100   90   90

     수학  영어   음악   체육   국어
서준   90  98   85  100  100
우현   80  89   95   90   80
민아   70  95  100   90   90
철수  100  80   98   77   90

원소에 접근

# 각 원소 접근 df.loc[인덱스명, 컬럼명], df.loc[인덱스명][컬럼명]
# df.iloc[인덱스첨자, 컬럼위치 인덱스], df.iloc[인덱스첨자][컬럼위치]
# 서준의 영어점수 검색
print(df2.loc['서준','영어'],df2.loc['서준']['영어'],df2.loc['서준'][1])
print(df2.iloc[0,1],df2.iloc[0]['영어'],df2.iloc[0][1])

# 서준과 우현의 영어 점수
print(df2.loc[['서준','우현'],'영어'])

# 서준의 영어점수를 100으로 수정
df2.loc['서준','영어'] = 100
print(df2)

# 서준부터 민아까지의 수학과 영어점수를 출력
print(df2.loc['서준':'민아',['수학','영어']])
print(df2.loc['서준':'민아'][['수학','영어']])

실행결과

100 100 100
100 100 100
서준    100
우현     89
Name: 영어, dtype: int64
     수학   영어   음악   체육   국어
서준   90  100   85  100  100
우현   80   89   95   90   80
민아   70   95  100   90   90
철수  100   80   98   77   90
    수학   영어
서준  90  100
우현  80   89
민아  70   95
    수학   영어
서준  90  100
우현  80   89
민아  70   95

특정 컬럼을 인덱스로 설정

df3 = df.copy()
# 이름을 추가 컬럼명 이름: 우현, 서준, 민아
df3['이름'] = ['우현','서준','민아']
print(df3)

# 특정 컬럼을 인덱스로 설정
# df.set_index(컬럼명, inplace = True)
df3.set_index('이름',inplace=True)
print(df3)

# 인덱스 초기화 df.reset_index(inplace=True)
df3.reset_index(inplace=True)
print(df3)

실행결과

   수학  영어   음악   체육  이름
0  90  98   85  100  우현
1  80  89   95   90  서준
2  70  95  100   90  민아
    수학  영어   음악   체육
이름                  
우현  90  98   85  100
서준  80  89   95   90
민아  70  95  100   90
   이름  수학  영어   음악   체육
0  우현  90  98   85  100
1  서준  80  89   95   90
2  민아  70  95  100   90

요약

데이터프레임 : 2차원 배열 ( 시리즈가 열로 묶인 배열 )
인덱스 접근방법 : df.loc[인덱스명], 값이 여러개 df.loc[ [인덱스명, ...] ]
컬럼 접근 방법 : df[컬럼명]
원소 접근 방법 : df.loc[인덱스명, 컬럼명],
                 df.iloc[인덱스첨자, 컬럼첨자] 
인덱스 생성 : df.index = [ 인덱스명, ...]
특정 컬럼을 인덱스로 : df.set_index(컬럼명, inplace=True)
인덱스 초기화 : df.reset_index(inplace=True)
인덱스 재배열 : df.reindex([인덱스명, ...])
인덱스 삭제 : df.drop(index=[인덱스명])
컬럼 삭제 : df.drop(columns=[컬럼명], axis=1)

 

P.S

주피터노트북에서 print()함수를 쓰다보면 한글이 넓이 차이로 줄이 잘 안맞게 나오는 경우가 많다.

이럴 때는 print()함수 대신에 display()함수를 쓰면 데이터프레임이 예쁘게 출력된다.

주피터노트북을 쓰지않겠다면 pip를 이용해서 ipython을 설치하고

pip install IPython

아래 코드를 통해 함수를 가져와서 사용할 수 있다.

from IPython.display import display

 

728x90
반응형

댓글