프로그래밍/파이썬

EDA - 1단계 : 데이터 다루기 - 가공

매 석 2023. 7. 13. 18:52
반응형

- 과거내용

 

EDA - 1단계 : 데이터 다루기 - 정렬, 결합

과거 내용 DataFrame - 정렬 1. 값 정렬 by는 어떤 부분을 정렬할 지 선택하고, axis는 행과 열을 선택하...

blog.naver.com

 

- DataFrame - 가공

 

1. 삽입

#원본 데이터
      col1  col2  col3
row1     1     2     3
row2     4     5     6
row3     7     8     9

#삽입
df.insert(3,'col4',[10,11,12])

      col1  col2  col3  col4
row1     1     2     3    10
row2     4     5     6    11
row3     7     8     9    12

 

 

​insert 명령어로 각각 삽입될 열의 위치, 이름, 값을 순서대로 입력하여 삽입할 수 있다.

 

2. 꺼내기

#원본 데이터
      col1  col2  col3
row1     1     2     3
row2     4     5     6
row3     7     8     9

#열 제거
df.pop('col1')
      col2  col3
row1     2     3
row2     5     6
row3     8     9

 

​pop을 사용해서 제거 혹은 꺼낼 열의 이름을 입력한다.

 

3. 복사

#원본 데이터
      col1  col2  col3
row1     1     2     3
row2     4     5     6
row3     7     8     9

#복사
df2=df.copy(deep=False)

      col1  col2  col3
row1     1     2     3
row2     4     5     6
row3     7     8     9

 

deep이 False인 경우 복사본이나 원본이 수정되면 같이 수정된다.

C의 포인터와 느낌이 비슷한 것 같다.

4. 행/열 삭제

#원본 데이터
      col1  col2  col3
row1     1     2     3
row2     4     5     6
row3     7     8     9

#삭제
df=df.drop(labels='row1',axis=0)

      col1  col2  col3
row2     4     5     6
row3     7     8     9

 

 

drop의 labels와 axis를 사용해서 삭제했다. 이외에도 index와 columns를

사용해서 삭제할 수 있다.

5. 행 추가

#원본 데이터
      col1  col2  col3
row1     1     2     3
row2     4     5     6
row3     7     8     9

#행 추가
df2=df.drop(labels='row1',axis=0)
df=df.append(df2,sort=True,ignore_index=True)

   col1  col2  col3
0     1     2     3
1     4     5     6
2     7     8     9
3     4     5     6
4     7     8     9

 

append의 sort를 사용해 사전순으로 정렬하고, ignore_index는 기존 index를

무시할 수 있게 해준다. 이외에도 verify_integrity를 사용하면 중복되는 인덱스가 있으면

오류를 발생할 수 있다.

6. 자르기

#원본 데이터
      col1  col2  col3
row1     1     2     3
row2     4     5     6
row3     7     8     9

#자르기
df=df.truncate(before='col2',after='col2',axis=1)

     col2
row1     2
row2     5
row3     8

 

truncate의 before는 그 값보다 전 값을 삭제하고, after는 그 값의 후를 삭제한다.

axis는 행과 열을 택해 삭제할 수 있다.

7. 중복행 제거

#원본 데이터
      col1  col2  col3
row1     1     2     3
row2     4     2     6
row3     7     8     9

#중복행 제거
df=df.drop_duplicates(subset='col2')

      col1  col2  col3
row1     1     2     3
row3     7     8     9

 

drop_dupicates의 subset을 통해 중복행을 찾고 삭제한다.

추가로 keep 옵션을 사용해 중복행 중 어떤 행을 남길지 고를 수 있다.

이외에도 ignore_index, inplace 등의 옵션이 있다.

8. 차원축소

#원본 데이터
      col1  col2
row1     1     2

#축소
print(df.squeeze())

col1    1
col2    2
Name: row1, dtype: int64

 

1개의 열 또는 행만 있는 데이터그램을 squueze하면 시리즈가 된다.

1개의 값만 가지면 스칼라 값이 되며, 압축이 안 되는 경우 원본을 반환한다.

9. 피벗변환

#원본 데이터
   A   B    C
0  a  10  100
1  b  20  200
2  c  30  300

#피벗변환
print(df.pivot(index='A',columns='B',values='C'))

B     10     20     30
A
a  100.0    NaN    NaN
b    NaN  200.0    NaN
c    NaN    NaN  300.0

 

pivot으로 index, columns, values를 선택해서 피벗 테이블을 만들 수 있다.

values를 지정하지 않으면 모든 데이터가 입력된다. 피벗 변환이 불가한 경우

오류가 발생한다.

10. 피벗생성

#원본 데이터
   A   B    C
0  a  10  100
1  b  20  200
2  c  30  300

#피벗생성
print(df.pivot_table(index='A',columns='B',values='C',aggfunc=np.sum,sort=True))

B     10     20     30
A
a  100.0    NaN    NaN
b    NaN  200.0    NaN
c    NaN    NaN  300.0

 

pivot과 마찬가지로 index, columns, values를 입력하고 추가로 aggfunc를 이용해

함수를 사용할 수 있다. 또한 sort로 정렬을 어떻게 할 지 설정할 수 있다.

이외에도 fill_value, margines 등의 옵션이 있다.

11. 피벗해제

#원본 데이터
   A   B    C
0  a  10  100
1  b  20  200
2  c  30  300

#피벗해제
print(df.melt(id_vars='A',value_vars=['B','C']))

   A variable  value
0  a        B     10
1  b        B     20
2  c        B     30
3  a        C    100
4  b        C    200
5  c        C    300

melt를 이용해서 'A'를 기준으로 'B','C'를 하위 값으로 피벗해제를 진행한 것이다.

12. 새 열 할당

#원본 데이터
   A   B   
0  1  10  
1  2  20 

#새 열 할당
print(df.assign(C=lambda x:x.B+5))

   A   B   C
0  1  10  15
1  2  20  25

 

assign을 이용해서 새로운 열을 lambda 함수를 이용해서 식을 만들어

추가할 수 있다.

13. 값 변경

#원본 데이터
   A   B   
0  1  10  
1  2  20 

#값 변경
print(df.replace(to_replace=1, value=3))

   A   B
0  3  10
1  2  20

 

replace 함수의 to_replace는 바꿀 값이고 value는 바꾼 값이다.

value 대신 method를 사용해 bfill, ffill 등이 가능하다.

또한 limit로 몇 개나 바꿀지 설정할 수 있다.

이외에도 regax를 사용해서 정규표현식을 이용할 수 있다.

14. 값 전개

#원본 데이터
         A        B
0  [1, 10]  [2, 20]

#값 전개
print(df.explode(column=['A','B']))

    A   B
0   1   2
0  10  20

 

explode 함수를 이용해 전개할 column을 선택해 전개할 수 있다.

빈 리스트의 경우는 NaN 값을 반환한다.

추가로 ignore_index 옵션을 사용해 기존 인덱스를 무시할 수 있다.