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 |