파이썬 데이터프레임(Dataframe)

2023. 2. 9. 19:01코딩/파이썬

여태까지 배웠던 리스트, 튜플, 딕셔너리 자료형들에서 한눈에 보기 좋게 데이터를 출력하려면 별도의 작업을 해줘야 한다. 이러한 수고를 덜기 위해 pandas의 DataFrame을 사용한다.


pandas

  • 파이썬으로 데이터분석을 쉽게 하기 위해 R언어의 dataframe을 참고하여 만들어진 라이브러리
  • 1차원 배열인 series와 테이블 형식의 DataFrame 구조를 갖고 있다.

DataFrame 구조

DataFrame에는 다양한 유형의 데이터를 사용할 수 있다. 파이썬의 리스트, 튜플, 딕셔너리 등 모든 자료형과 호환된다.

DataFrame(data, *index, *columns, *dtype)

DataFrame의 기본 구조는 위와 같다. 정렬할 데이터를 data인자로 넘기고, index와 columns옵션으로 행과 열에 라벨을 지정할 수 있다. dtype은 DataFrame에 사용되는 데이터의 타입을 지정하는데, 문자열을 str이 아닌 object로 표현한다.

 

DataFrame 만들기

from padnas import DataFrame

person1 = ['prOv3rt', 'python', 'Korean']
person2 = ['hailey','java','American']

df = DataFrame(person1)

 

df객체에 person1의 정보를 DataFrame형식으로 저장하는 구문이다. 위와 같이 컬럼이나 인덱스에 라벨을 지정하지 않을 경우, 컬럼과 인덱스는 자동으로 0부터 라벨링된다.

df2 = DataFrame(person2, index = ['name','lang','nation'], columns = ['p2'])
df2 = DataFrame(person2, ['name','lang','nation'], ['p2'])

index와 column의 라벨을 지정할 땐 데이터의 개수와 맞춰줘야 한다. 인자의 순서를 정해진대로 넣으면 index와 columns는 생략해도 된다. 

DataFrame은 여러 형식의 데이터를 지원한다. 가장 자주 쓰이는 것은 딕셔너리 자료형인데, 이 경우 딕셔너리의 key가 컬럼 라벨이 된다.

data = {'name':['a','b','c'], 'type':['int','str','obj']}
df = DataFrame(data)
print(df)

data 딕셔너리의 key인 name과 type이 컬럼 라벨로 사용되었다.


DataFrame에서 특정 열(컬럼)과 행(인덱스) 선택하기

단일 컬럼 접근

df['name']
df['type']

 

  name type
0 a int
1 b str
2 c obj

데이터프레임이름[컬럼라벨]로 특정 컬럼에 접근한다.

 

행 접근

슬라이싱기법

df[0:2]
  name type
0 a int
1 b str
2 c obj

특정 범위의 행을 출력할 땐 슬라이싱 기법을 이용한다. 특정 열 범위를 선택하기 위해 df['name':'type']과 같이 쓰면 인덱스에서 'name'과 'type'을 찾으므로 오류를 발생시킨다. 

 

.iloc[ ]

df.iloc[0]
  name type
0 a int
1 b str
2 c obj

iloc[인덱스]로 특정 행만 선택할 수 있다. iloc은 위치지정이 가능해서 특정 위치의 값을 지정할 수도 있다.

df.iloc[0][1]
  name type
0 a(0,0번째) int(0,1번째)
1 b(1,0번째) str(1,1번째)
2 c(2,0번째) obj(2,1번째)

 

특정 컬럼, 행 선택

.loc[인덱스 범위, 컬럼 범위]

.iloc과의 다른점은 라벨명으로도 지정이 가능하다는 것이다.

df.loc[0:1,'name']
  name type
0 a(0,0번째) int(0,1번째)
1 b(1,0번째) str(1,1번째)
2 c(2,0번째) obj(2,1번째)

슬라이싱 기법으로 범위를 지정해도 돼고, 연속하지 않는 행과 열을 선택할 땐 리스트로 직접 행과 열의 라벨을 넘겨줄 수 있다. 다음은 리스트로 넘기는 예제다.

df.loc[[0,2],'type']
  name type
0 a(0,0번째) int(0,1번째)
1 b(1,0번째) str(1,1번째)
2 c(2,0번째) obj(2,1번째)

조건 범위선택

데이터프레임이름[조건]으로 조건을 설정한다.

아래는 A, B, C 선수들의 달리기 기록을 4일동안 측정한 데이터다.

dates = pd.date_range('20211116', periods = 4)
time = pd.DataFrame(np.random.rand(4,3), index = dates, columns = list('ABC'))

컬럼값을 기준으로 특정 열 추출하기

A선수를 기준으로 0.3초가 넘는 기록만 추출해보자.

time[time.A > 0.3]

A선수의 기록 중 유일하게 0.3초가 넘는 11월 18일의 기록만 추출되었다.

 

이번에는 데이터프레임 전체 값을 기준으로 설정하여 해당되는 값을 추출해보자.

time[time > 0.3]

0.3이 넘는 값들만 추출되고 나머지 값은 NaN으로 출력되었다. 이렇게 NaN으로 출력되는 데이터는 panda가 데이터를 측정하지 않아서(또는 여러가지 이유로 못해서) 비어있는 곳으로, '결측치'라고 한다. 

결측치가 존재하는 행을 없애고 싶다면, dropna( )메서드를 이용한다. 
time[time > 0.3].dropna(how='any')

결측치가 하나도 없는 11/18일 데이터만 남았다.

결측치를 다른 값으로 채우고 싶다면 fillna( ) 메서드를 사용한다.
time[time > 0.3].fillna(value='fail')

결측치가 설정한 value 값으로 채워졌다.


DataFrame 수정하기

컬럼, 행 추가하기

컬럼 추가하기

기존 데이터프레임에 새로운 컬럼을 추가하려면 같은 타입의 인덱스를 가진 시리즈를 하나 추가하면 된다.

D = pd.Series([1,2,3,4], index = dates)
time['D'] = D

D선수의 기록이 추가되었다.

 

행 추가하기

append( ) 메서드 사용

append( )메서드를 사용해 데이터프레임 타입 객체를 추가한다.

이 때, 인덱스나 컬럼에 라벨이 있는 경우 추가하는 데이터프레임 객체에도 같은 라벨을 설정해야 한다.

아래와 같이 그냥 추가 하면..

new_time = pd.DataFrame(np.random.rand(1,3), index = ['2021-11-20'])
time.append(new_time)

이렇게 새로운 데이터프레임에서 새 컬럼 라벨을 붙여 이상하게 추가된다.

new_time = pd.DataFrame(np.random.rand(1,3), index = ['2021-11-20'], columns = list('ABC'))

컬럼 라벨을 제대로 맞춰주고 추가하면 다음과 같이 잘 된다.

다만 기존 데이터프레임인 곳에서 저렇게 새로운 날짜..?가 추가되는데, 이거는...아직 해결방법을 모르겠다.

 

컬럼, 행 삭제

.drop( ) 메서드 - 행 삭제

#drop(index명)
time.drop(time.index[0])

11-16일 행이 사라졌다.

.drop( ) 메서드는 컬럼은 적용할 수 없다.

 

del 함수 - 컬럼 삭제

컬럼은 내장함수 del을 사용하여 삭제할 수 있다.

'코딩 > 파이썬' 카테고리의 다른 글

[Selenium] 네이버 로그인  (0) 2023.02.09
파이썬 자동화 라이브러리  (0) 2023.02.09
딕셔너리(Dictionary)  (0) 2023.02.09
리스트(List)  (0) 2023.02.09
모듈(Module)  (0) 2023.02.09