Python

[Python] 판다스(Pandas) 총정리 / 시리즈(Series)/ 데이터 프레임(data frame)/ csv 파일 읽어오기

Let it out 2024. 2. 10. 22:42

Pandas 란?

Pandas(판다스)는 데이터 조작 및 분석을 할 수 있는 파이썬의 라이브러리다.
 
Pandas는 일반적인 상황에서도 많이 사용되며 머신 러닝, 딥 러닝 분야 서 데이터를 처리 할 때 필수로 사용된다.
 
판다스

 

 

 
 

 

 

Pandas VS Numpy

데이터를 처리가 가능한 파이썬 라이브러리 중 유명하고 많이 사용하는것이 Pandas Numpy다.
 
따라서 비슷해 보이면서 다른 pandas와 numpy의 차이점을 알아야한다.
 
우선 아래 표를 대충 훑어 보고 아래로 넘어가자.
 
기능/ 특성
Pandas Numpy
데이터 구조 DataFrame, Series ndarray
데이터 유형 다양한 데이터 유형 (숫자, 문자열, 날짜 등) 지원 동일한 데이터 유형만 처리 (일반적으로 숫자)
데이터 정렬 및 라벨링 라벨링 가능한 축 (행 및 열에 이름 부여) 배열은 인덱스 또는 정수 인덱스로만 액세스 가능
데이터 조작 및 필터링 SQL과 유사한 데이터 조작 및 필터링 지원 배열 기반으로 데이터 조작 및 필터링
결측값 처리 결측값(NaN) 처리 및 대체 기능 지원 결측값 처리 및 대체 기능 없음
데이터 그룹화 및 집계 데이터 그룹화 및 집계 기능 지원 기본적인 집계 함수만 사용 가능
시계열 데이터 처리 효율적인 시계열 데이터 처리 지원 시계열 데이터 처리에 제한적
인덱싱 및 슬라이싱 다양한 인덱싱 및 슬라이싱 옵션 제공 기본적인 슬라이싱 및 인덱싱만 지원
데이터 입출력 다양한 데이터 형식을 읽고 쓸 수 있음 주로 배열을 파일로 저장하고 읽는 기능
성능 및 메모리 관리 일반적으로 느리고 메모리 소비가 높음 빠르고 메모리 효율적
주요 사용 사례 데이터 분석 및 조작, 데이터 전처리 과학 및 수학 계산, 배열 조작
 
위에 표를 요약하자면
 
pandas데이터 조작 및 분석에 특화되어 있고 테이블 형식데이터에 적합하다.
 
numpy과학 및 수학 계산에 특화되어 있으며 다차원 배열을 다루는 데 적합하다.
 
이때, Pandas는 numpy의 대부분의 기능을 포함하며 추가적인 기능을 가지고 있다.
 
그럼 왜 Pandas만 쓰면 되지 Numpy를 쓸까? 
 
이유는 numpy3차원 이상의 배열 데이터를 담을 수 있지만 Pandas는 최대 2차원 데이터 밖에 담지 못한다.
(Pandas에서 CSV 파일을 불러오면 3차원 이상의 데이터를 담을 수는 있다.)
 
결론 : 데이터 처리 작업에 따라 두 라이브러리 중 하나를 선택해서 사용하면 된다.
 
 
 

Pandas 데이터 구조

Pandas는 시리즈(Series), 데이터 프레임(DataFrame), 패널(Panel) 총 3개의 데이터 구조가 있으며, 이 중에서 데이터 프레임을 가장 많이 사용한다. 
 
시리즈는 데이터 프레임을 공부하기 전 꼭 알아야 데이터 구조다.
 
따라서 게시글에서는 시리즈, 데이터 프레임 2개의 데이터 구조에 대해 설명한다.
 
또한 많이 사용하는 CSV 파일을 불러서 데이터 프레임 구조로로 바꿔서 읽는 방법을 설명한다.
 
패널은 필요 하게 되면 따로 공부하면 된다.
 

 

Pandas import

Pandas 패키지를 설치하고 pd 라는 이름으로 import 해주는 것이 관례다.
import pandas as pd

 

 



 

1. 시리즈(Series)

데이터 프레임을 사용하기 전에 시리즈의 개념을 알고 넘어가야 한다.
 
시리즈1차원 배열값(values)에 대응하는 인덱스(index)를 부여할 수 있다.
 
"1000, 2000, 3000, 4000" 이라는 에 각각 "레쓰비, 콜라, 맥주, 소주" 라는 인덱스를 부여하는 예제다.
import pandas as pd

sr = pd.Series([1000, 2000, 3000, 4000],index=["레쓰비", "콜라", "맥주", "소주"])

print(sr)
<결과>
레쓰비    1000
콜라     2000
맥주     3000
소주     4000
dtype: int64
 
 

값, 인덱스 출력

값과 인덱스를 출력 할 수 있다.
print('값 : ', sr.values)
print('인덱스 : ', sr.index)

<결과>

값 :  [1000 2000 3000 4000]
인덱스 :  Index(['레쓰비', '콜라', '맥주', '소주'], dtype='object')
 
 
 

name 속성

name 속성을 사용하면 시리즈의 이름을 지정 할 수 있다.
 
 Name : Example 로 시리즈의 이름을 지정했다.
import pandas as pd

sr = pd.Series([1000, 2000, 3000, 4000],index=["레쓰비", "콜라", "맥주", "소주"], name = "Example")

print(sr)
<결과>
레쓰비    1000
콜라     2000
맥주     3000
소주     4000
Name: Example, dtype: int64
 
 
 

인덱스 지정 하지 않기

인덱스를 지정 하지 않고  값으로만 시리즈를 생성 할 수 있다.
 

인덱스를 지정하지 않으면, 인덱스의 값은 0부터 시작하는 시퀀스가 지정된다.

import pandas as pd

sr = pd.Series([1000, 2000, 3000, 4000], name = "Example")

print(sr)

<결과>
0    1000
1    2000
2    3000
3    4000
 
 
 

시리즈 인덱싱 접근

인덱싱 접근도 가능하다.
 
레쓰비의 값을 출력했다.
import pandas as pd

sr = pd.Series([1000, 2000, 3000, 4000],index=["레쓰비", "콜라", "맥주", "소주"], name = "Example")

print(sr['레쓰비'])
<결과>
1000
 
 
 

값 바꾸기

인덱스에 접근해 값도 바꿀 수 있다.
import pandas as pd

sr = pd.Series([1000, 2000, 3000, 4000],index=["레쓰비", "콜라", "맥주", "소주"], name = "Example")

sr['레쓰비'] = 5000
print(sr)
<결과>
레쓰비    5000
콜라     2000
맥주     3000
소주     4000
Name: Example, dtype: int64
 
 
 

명시적 인덱스 접근 VS 암시적 인덱스 접근

인덱스 지정 후, 인덱스 접근 시 인덱스의 명으로도 접근 할 수 있고 시퀀스(숫자)로도 접근이 가능하다.
 
이때, 인덱스 명으로 접근하면 명시적 인덱스 접근,
 
시퀀스(숫자)로 접근하면 암시적 인덱스 접근이라고 한다.

 

 

명시적 인덱스 접근 

명시적 인덱스 접근은 인덱스 명으로 접근해야 한다. 따라서 시퀀스(숫자)를 적으면 에러가 발생한다.
 
loc 속성을  사용해 인덱스 명을 적어주면 된다.
import pandas as pd

sr = pd.Series([1000, 2000, 3000, 4000],index=["레쓰비", "콜라", "맥주", "소주"], name = "Example")

print(sr.loc["레쓰비"])
<결과>
1000
 
 

암시적 인덱스 접근 

암시적 인덱스 접근은 인덱스 명 대신 시퀀스를 적어주면 된다.
 
iloc 속성을 사용해 시퀀스를 적어준다.
 
레쓰비, 콜라, 맥주, 소주 는 순서대로 0, 1, 2, 3번째 시퀀스가 된다.
import pandas as pd

sr = pd.Series([1000, 2000, 3000, 4000],index=["레쓰비", "콜라", "맥주", "소주"], name = "Example")

print(sr.iloc[0])
<결과>
1000
 
 

인덱스 슬라이싱

인덱스 슬라이싱도 가능하다.
import pandas as pd

sr = pd.Series([1000, 2000, 3000, 4000],index=["레쓰비", "콜라", "맥주", "소주"], name = "Example")

print(sr[0:2])
<결과>
레쓰비    1000
콜라     2000
Name: Example, dtype: int64
 
 
 

딕셔너리로 시리즈 생성

지금까지 위에 예제는 리스트로 시리즈를 만들었다.
 
리스트 뿐만 아니라 딕셔너리로도 시리즈를 만들 수 있다.
import pandas as pd

sr = pd.Series({"레쓰비":1000, "콜라":2000, "맥주":3000, "소주":4000}, name = "Example")

print(sr)
<결과>
레쓰비    1000
콜라     2000
맥주     3000
소주     4000
Name: Example, dtype: int64
 

 



2. 데이터 프레임(Data Frame)

지금까지 시리즈에 대해 알아 봤으니, 이번엔 데이터 프레임에 대해 알아보자.
 
시리즈가 1차원 데이터 였다면, 데이터 프레임은 2차원 데이터행과 열을 가지게 되는 데이터 구조다.
 
시리즈값, 인덱스로 구성 되었다면, 데이터 프레임값, 인덱스, 열(columns)로 구성된다.
 
 
 

데이터 프레임 생성

값, 인덱스, 열 세개의 구성 요소를 넣고 데이터 프레임을 생성해 보자.
 
3 x 3인 2차원 데이터가 만들어진다.
 
index이 되고, columns이된다.
import pandas as pd

values = [[1, 2, 3], [4, 5, 6], [7, 8, 9]]
index = ['1행', '2행', '3행']
columns = ['1열', '2열', '3열']

df = pd.DataFrame(values, index=index, columns=columns)

print(df)
<결과>
       1열  2열  3열
1행   1   2   3
2행   4   5   6
3행   7   8   9
 
 
 

값, 인덱스, 열 출력

값, 인덱스, 열은 다음과 같이 출력 가능하다.
print("값 : \n", df.values)
print("인덱스(행): ", df.index)
print("열 : ", df.columns)
<결과>
값 : 
 [[1 2 3]
 [4 5 6]
 [7 8 9]]
인덱스(행):  Index(['1행', '2행', '3행'], dtype='object')
열 :  Index(['1열', '2열', '3열'], dtype='object')
 
 

리스트로 데이터 프레임 생성  

리스트로 데이터 프레임을 생성 예제다.
 
2차원 데이터만 넘겨주고, 인덱스와 열의 이름을 지정하지 않아 이름이 숫자로 채워진다.
import pandas as pd

data = [[1, 2, 3],
        [4, 5, 6],
        [7, 8, 9]]

df = pd.DataFrame(data)

print(df)
<결과>
    0  1  2
0  1  2  3
1  4  5  6
2  7  8  9
 
 
 

인덱스 지정 해주기

index(행) 의 이름을 지정해주는 예제다.

import pandas as pd

data = [[1, 2, 3],
        [4, 5, 6],
        [7, 8, 9]]

index = ['1행','2행','3행']
df = pd.DataFrame(data, index=index)

print(df)
<결과>
        0  1  2
1행  1  2  3
2행  4  5  6
3행  7  8  9
 
 
 

열 지정 해주기 

columns(열) 의 이름을 지정해 주는 예제다.

import pandas as pd

data = [[1, 2, 3],
        [4, 5, 6],
        [7, 8, 9]]

index = ['1행','2행','3행']
columns = ['1열','2열','3열']

df = pd.DataFrame(data, index=index, columns=columns)

print(df)
<결과>
     1열  2열  3열
1행   1   2   3
2행   4   5   6
3행   7   8   9
 
 
 

딕셔너리로 데이터 프레임 생성 

딕셔너리로 데이터 프레임 생성이 가능하다.
import pandas as pd

data = {
        '1열' : [1, 2, 3],
        '2열' : [4, 5, 6],
        '3열' : [7, 8, 9]
        }

index = ['1행','2행','3행']

df = pd.DataFrame(data, index=index)

print(df)
<결과>
       1열  2열  3열
1행   1   4   7
2행   2   5   8
3행   3   6   9
 
 
 

df.head()

head() 메서드는 처음 부터 n개 까지 조회한다.
 
주의 할 점은 n의 시작 1부터다.
import pandas as pd

data = {
        '1열' : [1, 2, 3],
        '2열' : [4, 5, 6],
        '3열' : [7, 8, 9]
        }

index = ['1행','2행','3행']

df = pd.DataFrame(data, index=index)

print(df.head(2))
<결과>
       1열  2열  3열
1행   1   4   7
2행   2   5   8
 
 
 

df.tail()

tail() 메서드는 head() 와 다르게 뒤 에서부터 n개를 출력한다.
import pandas as pd

data = {
        '1열' : [1, 2, 3],
        '2열' : [4, 5, 6],
        '3열' : [7, 8, 9]
        }

index = ['1행','2행','3행']

df = pd.DataFrame(data, index=index)

print(df.tail(2))
<결과>
    1열  2열  3열
2행   2   5   8
3행   3   6   9
 
 
 

열 조회하기

보고 싶은 열의 이름을 적으면 해당 열을 출력한다.
import pandas as pd

data = {
        '1열' : [1, 2, 3],
        '2열' : [4, 5, 6],
        '3열' : [7, 8, 9]
        }

index = ['1행','2행','3행']

df = pd.DataFrame(data, index=index)

print(df['2열'])
<결과>
1행    4
2행    5
3행    6
 
 
 

열의 특정 값 조회하기 

loc 속성을 사용해 행의 시퀀스와 조회하고 싶은 열을 적어주면 된다.
 
예제에서는 2번째 행, 2번째 열을 조회한다.
import pandas as pd

data = {
        '1열' : [1, 2, 3],
        '2열' : [4, 5, 6],
        '3열' : [7, 8, 9]
        }

df = pd.DataFrame(data)

print(df.loc[1,'2열'])
<결과>
5
 
 

행 조회하기 

인덱스 접근에는 명시적 인덱스 접근, 암시적 인덱스 접근이 있다.
 
명시적 인덱스 접근은 인덱스(행)의 이름을 적어주고,
 
암시적 인덱스 접근 은 인덱스(행)의 시퀀스를 적어준다.
 
 

명시적 인덱스 접근

loc 속성을 사용해 index의 이름으로 조회한다.
 
시퀀스를 적으면 에러가 발생한다.
import pandas as pd

data = {
        '1열' : [1, 2, 3],
        '2열' : [4, 5, 6],
        '3열' : [7, 8, 9]
        }

index = ['1행','2행','3행']

df = pd.DataFrame(data, index=index)

print(df.loc['2행'])
<결과>
1열    2
2열    5
3열    8
Name: 2행, dtype: int64
 
 
 

암시적 인덱스 접근

명시적 접근과 반대로 인덱스에 주어진 이름 대신 시퀀스(숫자)를 적는다.
 
이때 iloc 속성을 사용해준다.
 
예제에서 1행, 2행, 3행은 각각 암시적으로 0, 1, 2 로 볼 수 있다.
import pandas as pd

data = {
        '1열' : [1, 2, 3],
        '2열' : [4, 5, 6],
        '3열' : [7, 8, 9]
        }

index = ['1행','2행','3행']

df = pd.DataFrame(data, index=index)

print(df.iloc[1])
<결과>
1열    2
2열    5
3열    8
Name: 2행, dtype: int64
 


3. CSV 파일 읽기

Pandas 에서 CSV, Excel, HTML, SQL, JSON 등 다양한 파일의 데이터를 읽고 데이터 프레임을 만들 수 있다.
 
그 중 CSV 파일을 읽어와서 데이터 프레임 구조로 바꿔보는 방법에 대해 알아보자.
 

 

 

CSV란?

csv는 필드를 쉼표(,)로 구분한 텍스트 파일이다.
 
쉼표로 구분되어 있는 데이터 형식을 csv 파일 형식이라고 부르며,
 
확장자 명이 .csv라고 되어있으면  csv 파일이라고 한다.
 

 

 
 
 

csv 파일 만들기 

csv는 메모장, execl 등으로 만들 수 있다.
 
나는 메모장으로 csv 파일 만들었다.
 
열을 담당할 1열,2열,3열 을 적고 아래에 데이터 쉼표로 구분지어 적어주면 된다.
 
주의 : 띄어쓰기 없이 해야 한다!!
 
 
 

확장자를 .CSV로 저장하면 된다.

 
 
 

 

csv 프로젝트 폴더에 넣기

 

만든 test.csv를 프로젝트 폴더에 넣으면 된다.
 
만약 엑셀이 설치되어 있다면 메모장으로 적은 test.csv 파일이 엑셀로 자동변환 된다.
 
(엑셀로 test.csv를 열었을 때 ??? 가 뜨면서 글씨가 깨져 보여도 오류가 아니니 괜찮다.)


 

 
 

 

csv 가져오기

 

read_csv로 읽어오면 된다.
 
이때 csv 파일을 자동으로 데이터 프레임 구조로 바꿔준다.

 

import pandas as pd

df = pd.read_csv('test.csv')

 
 
 

 

데이터 프레임 출력 하기 

 

출력 해보면 정상적으로 csv파일을 가져 온것을 확인 할 수 있다.
 
인덱스(행)는 자동으로 시퀀스가 부여된다.

 

print(df)
<결과>
   1열  2열  3열
0   1   2   3
1   4   5   6
2   7   8   9
 

 

 

반응형