Tiny Star

✨Framework+Library/🐼PANDAS

[🐼Pandas] Data 객체 데이터 다루기

청크 2024. 3. 28. 14:45

판다스(Pandas)에 대해 소개할 때 단순히 Data 객체가 어떻게 생성되는지 예시코드만 던졌었다.

 

여기서는 객체의 행 또는 열을 선택하거나 추가/삭제/변경 등의 기능을 좀 더 상세히 적어놓으려 한다.


DataFrame 객체

행과 열로 이루어진 2차원 데이터를 다루기 위한 것으로 열은 각각의 변수, 행은 관측치를 나타낸다.

 

[생성하기]

데이터를 생성할 때는 list, dict(딕셔너리), EXCEL 등 다양하게 생성을 할 수 있다.

 

1. list를 사용해서 Data Frame 객체 생성하기

import pandas as pd #pandas 대신 pd 라는 별칭 사용의 의미

data = [['A', 1]], ['B',2], ['C',3]]
df = pd.DataFrame(data, columns ['col1', 'col2'])
print (df)

data 라는 변수 안에 행에 들어 갈 데이터들을 순서대로 작성해주고

df 라는 변수 안에 다시 값을 넣어주는데, 이 때 pd.dataFrame은 값을 데이터프레임 타입으로 변경해준다.

columns를 사용해서 원하는 컬럼값을 지정해주고 print 해보면 아래와 같은 출력결과가 나온다.

  출력 결과
   col1  col2 #column
0    A     1  #['A', 1]
1    B     2  #['B',2]
2    C     3  #['C',3]

 

2. ict(딕셔너리) 를 사용하여 DataFrame 객체 생성하기

우선 딕셔너리란 나처럼 자바만 팠던 사람들한테 낯선 존재긴한데,

형태만 살펴보면 HASH MAP의 형태와 같다. 키와 값으로 이루어진 형태로 키를 호출하면 값이 출력되는 구조이다.

 

판다스 데이터프레임에서 이 딕셔너리를 사용하여 DataFrame객체 생성이 가능하다.

data = {
	'col1': ['A', 'B', 'C'], 
	'col2': [1, 2, 3]
    }
    
df = pd.DataFrame(data)
print(df)

먼저 data를 보면 'col1'이라는 key값안에 ['A','B','C'] 라는 값이 있고 col2도 마찬가지의 구조로 되어있다.

이 key-value의 한 쌍을 {}로 묶어 딕셔너리의 형태를 띄고 있다.

 

이후 리스트와 동일하게 pd.DataFrame을 사용해서 data를 담아주면!

     출력 결과
    col1  col2 #key값
 0    A     1  #value 1번째 값
 1    B     2  #value 2번째 값
 2    C     3  #value 3번째 값

Key값이 곧 column값이 되고, value에 담겨있던 순서대로 열을 기준으로 값이 써내려가진다.

 

3. 파일을 사용하여 DataFrame 객체 생성하기

csv 또는 xlsx의 확장자를 가진 파일을 사용하여 DataFrame객체로 만들 수 있는데이건 무지 쉽다.

 

파이썬 파일과 같은 경로에 담아 둔 뒤 pd.read_csv/excel 을 사용해서 그냥 파일명을 명시해주면 된다.

df = pd.read_csv('data.csv') #csv
df = pd.read_excel('data.xlsx') #xlsx

 

참고로 xlsx로 불러올 때 [XLRDError : Excel xlsx file; not supported] 라는 이상한 오류를 만날 수 있는데

xlrd가 업데이트 되면서 xlsx를 지원하지 않아서 뜨게되는 오류라고 한다.

 

이 문제는  openpyxl 모듈을 설치해주고 engine를 'openpyxl'으로 바꿔주면 쉽게 해결된다.

df = pd.read_excel('data.xlsx', engine='openpyxl)

 

이렇게 불러온 데이터를 데이터프레임 객체로 만들고 싶다면?

df = pd.DataFrame((pd.read_csv('data.csv')) #csv
df = pd.DataFrame((pd.read_excel('data.xlsx')) #xlsx

그냥 앞에 pd.DataFrame을 붙여주면 된다.

 

[선택하기]

이렇게 만들거나 불러 온 데이터 프레임 객체들 중 특정 열이나 행만 선택하고 싶은 경우가 생긴다.

 

1. 열(column)선택하기

df ['col1'] 
df [['col1', 'col2']] #다중으로 선택할 때

데이터프레임을 담았던 df.

그에 맞는 컬럼을 하나씩 나열해주면 된다. 하나만 쓰면 한개 컬럼만, 여러개 쓰면 다중의 컬럼이 선택된다.

 

2. 행(row) 선택하기

df.loc[0]
df.loc[[0, 1, 2]]

행은 df 뒤에 .loc를 붙여주고 선택하는 방법은 열과 동일하다.

 

df.loc[index, column]

이런 형식으로도 사용을 하는데, 행의 인덱스와 칼럼명의 형태로 데이터 프레임의 정보를 가져올 수 있다.

index 는 선택하려는 행의 인덱스 레이블 값

column은 선택하려는 열의 이름 값을 넣으면 된다.

 

[조작하기]

데이터 프레임과 원하는 열 또는 행을 선택하고 나면 이걸 조작해야하는 순간이 온다.그때 쓸 수 있는 옵션들인데 어렵지 않다.

 

1. 열(column)

# 열 추가하기
df['col3'] = [4, 5, 6]

먼저 열을 추가해주면 col3이라는 칼럼이 만들어지고 4, 5, 6이라는 값이 들어가게 된다.

     출력 결과
    col1  col2  col3 #key값
 0    A     1     4  #value 1번째 값
 1    B     2     5  #value 2번째 값
 2    C     3     6  #value 3번째 값

 

반대로 .drop을 사용하면 해당 열을 삭제할 수 있다.

# 열 삭제하기
df.drop('col3', axis=1, inplace=True)

'col3'라는 이름을 가진 컬럼을 삭제할 것이라는 의미이고

axis는 간단하게 이야기하면 axis=0일 땐 행을 Drop. axis=1일때는 열을 Drop한다는 의미이다.

 

axis=0 - 각 열(column)의 모든 행(row)에 대해 동작한다는 의미로 진행방향이 위에서 아래. 즉, 세로로 동작한다.axis=1- 각 행(row)의 모든 열(column)에 대해 동작한다는 의미로 진행방향이 왼쪽에서 오른쪽. 즉, 가로로 동작한다.

 

우리는 col3이라는 이름의 열을 삭제할 것이기 때문에 axis=1을 써주면 col3 열에 대한 모든 행이 삭제될 것이다.

    출력 결과
    col1  col2 
 0    A     1 
 1    B     2  
 2    C     3

또하나

inplace라는 옵션이 True값으로 붙어 있는데, 이것의 목적은 기존 데이터프레임에 변경된 설정으로 덮어쓰겠다는 의미다.

특정 행을이나 열을 삭제하기 위해 drop()함수를 쓸 때 inplace를 사용하지 않으면

원하는 칼럼은 삭제되지만 그 데이터를 별도로 변수에 저장하지 않았기 때문에 다시 df(데이터프레임)를 불러오면

칼럼이 삭제되지 않은 상태로 불러와지게 된다.

 

그렇기 때문에 inplace=True를 입력하지 않으면 drop 후 특정 변수에 저장하도록 코드를 써주어야 하지만

inplace=True를 사용해주면 따로 저장하는 코드를 사용하지 않아도 기존 변수에 덮어쓰기가 가능해진다.

# 열 이름 변경하기
df.rename(columns={'col1': 'new_col1'}, inplace=True)

열(Column)의 이름을 변경할 때는 rename()을 사용해서 변경해줄 수 있다.

사실 칼럼의 이름을 바꾸는 일이 많을까 싶긴하지만, 가장 기본적인거니 적어본다.

'col1'칼럼의 이름을 'new_col1'로 바꾼다는 의미로 변경 전의 컬럼명과 변경하고 싶은 칼럼명을 적어주면 끝이다.

 

inplace 적용도 해주면 아래처럼 칼럼명이 바뀌어 출력이 된다.

     출력 결과
    new_col1  col2 
 0     A       1   
 1     B       2     
 2     C       3

 

 

2. 행(row)  열을 기준으로 데이터의 조작을 이해했다면 행도 같은 방식으로 조작이 되기 때문에 예시만 올려놓겠다.

# 행 추가하기
df.loc[3] = ['D', 4, 5]

# 행 삭제하기
df.drop(3, inplace=True)
   행 추가 출력 결과
    new_col1  col2 
 0     A       1   
 1     B       2     
 2     C       3
 3     D       4

Series 객체

시리즈는 인덱스와 값으로 이루어진 1차원 데이터를 다루기 위한 것으로

DataFrame객체에서 열을 선택해서  추출이 가능한 객체이고 데이터프레임과 마찬가지로 시리즈 객체 생성을 할 수 있다.

 

[생성하기]

 

1. list를 사용해서 Data Frame 객체 생성하기

import pandas as pd

data = [1, 2, 3]
s = pd.Series(data, index=['a', 'b', 'c'])
print(s)

pd.Series()를 사용해주고, column대신 index를 넣어주면 

index a, b, c 이름을 가진 행이 만들어지고 순서대로 1, 2, 3의 값이 들어갈 것이다.

출력 결과
 a    1
 b    2
 c    3

 

 

2. ict(딕셔너리) 를 사용하여 DataFrame 객체 생성하기

data = {'a': 1, 'b': 2, 'c': 3}
s = pd.Series(data)
print(s)

리스트를 사용해서 생성한 객체와 출력값은 같지만 딕셔너리 형태로 담아 만들 수도 있다.a키의 값1, b키의 값2 .. 이런식으로 매칭하여 딕셔너리를 통째로 pd.Series에 담아주면 된다.

 

직접 코드에서 생성하고 수정/삭제 등은 오늘 적은 내용대로 하면되고,

csv, xlsx 등처럼 이미 있는 데이터를 불러와서 가공하는 내용은 다음 포스팅에!