2. Pandas 정리

YJ·2023년 9월 24일
0

딥러닝을 위한 Pandas 문법

Dataframe

  • 2차원 테이블 구조를 가진 자료형

  • 딕셔너리 활용, 리스트 활용, csv 파일 활용하여 생성 가능함

  • df = pd.read_csv(파라미터)

  • 딕셔너리 형태

df = pd.DataFrame({"a":[1, 2, 3], "c":[4, 5, 6], "c":[7, 8, 9]})

a, b, c가 각각 열을 가르킴

  • 리스트 형태
df = pd.DataFrame([[1, 2, 3], [4, 5, 6], [7, 8, 9], ["a", "b", "c"]])

a, b, c가 각각 행을 가르킴

  • csv 형태
df = pd.DataFrame('test.csv', encoding="cp949")

Dataframe 함수

  • head, tail, shape, columns, info, describe, dtype
  • loc => 이름/라벨을 기준으로 사용
  • iloc => 행 번호(인덱스)를 기준으로 사용
  • 기본적인 대괄호는 col을 가지고 오지만, slicing은 row를 가지고 온다.
a.head(n=3) #상위 3개
  • 기본적으로 5개 데이터 가져옴
tail
a.tail(n=3) #하위 3개
shape
a.shape # 행, 열 갯수를 투플 형태로 리턴
columns
  • 데이터프레임의 column 반환
info
a.info() # 각 column의 갯수, 데이터타입 반환
describe
a.describe() # 각 column의 count, mean, std, min 등의 통계정보를 반환
dtype
a.dtypes # 각 column의 데이터 타입 반환

Data 조회

loc
x.loc[[100, 200], 'A'] # A컬럼의 100, 200번째 행을 가져 옴
iloc
x.iloc[[100], [1]] # 1번째 인덱스에 있는 A라는 컬럼의 100 번째 행을 가져 옴

Column 수정 및 삭제

x['C'] = x['A'] + x['B'] # 기존에 존재하는 컬럼 A와 B의 값을 합친 새로운 컬럼 C를 생성
# 컬럼 생성 시 맨 마지막 위치에 새로운 컬럼이 추가됨

 # 10번째 인덱스에 A컬럼의 값을 2배를 곱한 결과인 C컬럼을 추가하겠다.
 # 참고로, 인덱스는 0번째부터 시작한다.
 x.insert(10, x['C'], x['A'] * 2)
 
 x.drop('A', axis=0) # axis = 0 => 행 기준으로 삭제하겠다. (해당 경우, 첫 행이 삭제됨)
 x.drop('A', axis=1) # axis = 1 => 열 전체를 삭제하겠다. but 원본 데이터에서의 컬럼은 삭제되지 않는다.
 # 두 번째 경우, 컬럼을 지운 데이터프레임을 새 변수에 할당하면 된다.
 
  x.drop('A', axis=1, inplace=True) # inplace=True => 해당 경우 원본 데이터에서의 컬럼이 삭제된다.

Dataframe 변형

group by

  • 값을 하나로 묶고, 집계 결과를 얻기 위해 사용함.
x = pd.DataFrame('test.csv', encoding="cp949")

# group by
group = x.groupby('A') # A 컬럼에 속한 index를 dictionary 형태로 표현
# 해당 형태로 표현될 때, 같은 행 이름을 가진 것들끼리 같이 묶임
# count(), size(), sum(), mean(), std(), var(), max(), min() 함수 사용 가능

x.groupby(['Class', 'Gender']) # Class 별 Gender를 보여 줌
x.groupby(['Class', 'Gender']).mean()['C'] # Class, Gender 컬럼을 기준으로 인덱스를 정하고(그룹화하고), 그 중 C 컬럼만 선택하여 평균 구함

# set_index
x.set_index(['Class', 'Gender']) # group by와 동일한 기능. Class 별 Gender를 보여 줌
x.set_index(['Class', 'Gender'].groupby(level=[0])).count() # Class 컬럼 기준으로만 데이터를 확인하겠다는 의미 (Gender는 신경 쓰지 않게 됨)

# reset_index
x.reset_index(['Class', 'Gender']) # 기존 데이터프레임으로 변환

pivot, pivot_table

x = pd.DataFrame('test.csv', encoding="cp949")
  • pivot: 행 데이터를 열 데이터로 회전시키는 것
날짜도시온도
2023-01-01서울2
2023-01-01부산5
2023-01-02서울3
2023-01-02부산6
2023-01-03서울4
2023-01-03부산7
x.pivot(index='날짜', columns='도시', values='온도')
x.pivot('날짜', '도시', '온도')
도시부산서울
날짜
2023-01-0152
2023-01-0263
2023-01-0374
  • pivot_table: pivot이 할 수 없는 aggregate 함수를 통한 계산을 할 수 있음
    • 인덱스가 2개 이상인 경우
    • 컬럼이 2개 이상인 경우
    • 중복되는 값 처리 가능
x.pivot_table(index='날짜', columns='도시', values='온도')
# pivot 함수와 동일한 결과

stack, unstack

x = pd.DataFrame('test.csv', encoding="cp949")
날짜도시온도
02023-01-01부산5
12023-01-01서울2
22023-01-02부산6
32023-01-02서울3
42023-01-03부산7
52023-01-03서울4
  1. stack: 컬럼 레벨에서 인덱스 레벨로 데이터프레임 변경
x.stack()
날짜도시온도
2023-01-01부산5
서울2
2023-01-02부산6
서울3
2023-01-03부산7
서울4
  1. unstack: 인덱스 레벨에서 컬럼 레벨로 데이터프레임 변경
x.unstack() # 0번째 인덱스인 날짜 기준으로 데이터프레임 변경
날짜도시온도
02023-01-01부산5
2023-01-02부산6
2023-01-03부산7
12023-01-01서울2
2023-01-02서울3
2023-01-03서울4

Dataframe 병합

concat

  • 데이터 속성 형태가 동일한 데이터셋끼리 합칠 때 사용 (데이터프레임을 물리적으로 붙임)

column 명이 같은 경우

df1 = pd.DataFrame({'key1':[0, 1, 2], 'value1':['a', 'b', 'c']}, index=[0, 1, 2])
df2 = pd.DataFrame({'key1':[2, 3, 4], 'value1':['c', 'd', 'e']}, index=[2, 3, 4])

pd.concat([df1, d2], ignore_index=False)
key1value1
00a
11b
22c
22c
33d
44e
df1 = pd.DataFrame({'key1':[0, 1, 2], 'value1':['a', 'b', 'c']}, index=[0, 1, 2])
df2 = pd.DataFrame({'key1':[2, 3, 4], 'value1':['c', 'd', 'e']}, index=[2, 3, 4])

pd.concat([df1, d2], ignore_index=True) # 인덱스를 새로 세팅
key1value1
00a
11b
22c
32c
43d
54e

  • axis=1 => col로 합치는 경우
pd.concat([df1, d2], axis=1)  
key1value1key1value1
0aNaNNaN
1bNaNNaN
2c2c
NaNNaN3d
NaNNaN4e
  • axis=0 => row로 합치는 경우
pd.concat([df1, d2], axis=0)  
key1value1
00a
11b
22c
22c
33d
44e

column 명이 다른 경우

df1 = pd.DataFrame({'a':[0, 1, 2], 'b':['a', 'b', 'c']}, index=[0, 1, 2])
df2 = pd.DataFrame({'a':[2, 3, 4], 'b':['c', 'd', 'e'], 'c':['ㄱ', 'ㄴ', 'ㄷ']})
  • outer 방식 (합집합)
pd.concat([df1, df2], join='outer')
abc
00aNaN
11bNaN
22c
02c
13d
24e
  • inner 방식 (교집합)
pd.concat([df1, df2], join='inner')
ab
00a
11b
22c
02c
13d
24e

index 중복되는 경우

df1 = pd.DataFrame({'a':[0, 1, 2], 'b':['a', 'b', 'c']}, index=[0, 1, 2])
df2 = pd.DataFrame({'a':[2, 3, 4], 'b':['c', 'd', 'e']}, index=[2, 3, 4])
  • verify_integrity=False인 경우 에러 발생하지 않음
pd.concat([df1, df2], verify_integrity=False)
ab
00a
11b
22c
22c
33d
44e
  • verify_integrity=True인 경우 에러 발생
pd.concat([df1, df2], verify_integrity=True)

merge, join

merge

df1 = pd.DataFrame({'a':[0, 1, 2], 'b':['a', 'b', 'c'], 'c':['ㄱ', 'ㄴ', 'ㄷ']})
df2 = pd.DataFrame({'a':[2, 3, 4], 'd':['c', 'd', 'e'], 'e':['ㄱ', 'ㄴ', 'ㄷ']})
  • merge 함수는 merge할 데이터프레임에 데이터가 모두 존재하는 경우만 병합함 (inner 와 비슷)
pd.merge(df1, df2, on='a')
abcde
2cc
  • inner
pd.merge(df1, df2, on='a', how='inner')
abcde
2cc
  • left
pd.merge(df1, df2, on='a', how='left')
abcde
0aNaNNaN
1bNaNNaN
2cc
  • right
pd.merge(df1, df2, on='a', how='right')
abcde
2cc
3NaNNaNd
4NaNNaNe
  • outer
pd.merge(df1, df2, on='a', how='outer')
abcde
0aNaNNaN
1bNaNNaN
2cc
3NaNNaNd
4NaNNaNe
profile
💻귀찮으니 필요할 때만 쓰는 Computer Vision 일지 ㅇㅇ💻

0개의 댓글