[Python] 판다스(Pandas)란?
판다스(Pandas)란?
Pandas 란?
Pandas(판다스)는 데이터 조작 및 분석 이 가능한 파이썬의 라이브러리다.
Pandas는 머신 러닝, 딥 러닝에서 데이터를 처리 할 때 필수로 사용된다.
Pandas VS numpy
데이터를 처리 하는 파이썬 라이브러리 중 유명한 것이 Pandas, numpy다.
pandas는 numpy와 비슷하면서도 다르다.
아래는 pandas와 numpy의 차이점이다.
기능 / 특성 | Pandas | NumPy |
---|---|---|
데이터 구조 | DataFrame, Series | ndarray |
데이터 유형 | 다양한 데이터 유형 (숫자, 문자열, 날짜 등) 지원 | 동일한 데이터 유형만 처리 (일반적으로 숫자) |
데이터 정렬 및 라벨링 | 라벨링 가능한 축 (행 및 열에 이름 부여) | 배열은 인덱스 또는 정수 인덱스로만 액세스 가능 |
데이터 조작 및 필터링 | SQL과 유사한 데이터 조작 및 필터링 지원 | 배열 기반으로 데이터 조작 및 필터링 |
결측값 처리 | 결측값(NaN) 처리 및 대체 기능 지원 | 결측값 처리 및 대체 기능 없음 |
데이터 그룹화 및 집계 | 데이터 그룹화 및 집계 기능 지원 | 기본적인 집계 함수만 사용 가능 |
시계열 데이터 처리 | 효율적인 시계열 데이터 처리 지원 | 시계열 데이터 처리에 제한적 |
인덱싱 및 슬라이싱 | 다양한 인덱싱 및 슬라이싱 옵션 제공 | 기본적인 슬라이싱 및 인덱싱만 지원 |
데이터 입출력 | 다양한 데이터 형식을 읽고 쓸 수 있음 | 주로 배열을 파일로 저장하고 읽는 기능 |
성능 및 메모리 관리 | 일반적으로 느리고 메모리 소비가 높음 | 빠르고 메모리 효율적 |
주요 사용 사례 | 데이터 분석 및 조작, 데이터 전처리 | 과학 및 수학 계산, 배열 조작 |
정리 하면 pandas는 데이터 조작 및 분석에 특화되어 있으며 테이블 형식의 데이터에 적합하며, 데이터 프레임, 시리즈, 패널의 데이터 구조를 제공한다.
numpy는 과학 및 수학 계산에 특화되어 있으며 다차원 배열을 다루는 데 뛰어나다.
이때, Pandas는 numpy의 대부분의 기능을 포함하며 더 많은 기능이 있다. 하지만 numpy는 3차원 이상의 배열 데이터를 담을 수 있지만 Pandas는 최대 2차원 데이터 밖에 담지 못한다.(하지만 Pandas에서 CSV 파일을 불러오면 3차원 이상의 데이터를 담을 수 있다.)
즉, 데이터 처리 작업에 따라 두 라이브러리 중 하나를 선택한다.
Pandas import
Pandas 패키지를 설치하고 pd 라는 이름으로 import 해주는 것이 관례다.
import pandas as pd
Pandas 데이터 구조
Pandas는 총 3개의 데이터 구조를 사용하며 이 중 데이터 프레임을 가장 많이 사용한다. 시리즈, 데이터 프레임 2개의 데이터 구조를 알아보자.
- 시리즈(Series)
- 데이터 프레임(DataFrame)
- 패널(Panel)
1. 시리즈
가장 많이 사용되는 데이터 프레임을 사용하기 위해서는 시리즈의 개념을 확실히 짚고 넘어가야 한다.
시리즈는 1차원 배열의 값(values)에 대응하는 인덱스(index)를 부여할 수 있다. 아래 예제를 보자.
import pandas as pd
sr = pd.Series([1000, 2000, 3000, 4000],index=["레쓰비", "콜라", "맥주", "소주"])
print(sr)
<결과>
레쓰비 1000
콜라 2000
맥주 3000
소주 4000
dtype: int64
값, 인덱스
"1000, 2000, 3000, 4000" 이라는 값에 각각 "레쓰비, 콜라, 맥주, 소주" 라는 인덱스를 부여 했다.
값, 인덱스 출력
값과 인덱스를 출력 할 수 있다.
print('값 : ', sr.values)
print('인덱스 : ', sr.index)
<결과>
값 : [1000 2000 3000 4000]
인덱스 : Index(['레쓰비', '콜라', '맥주', '소주'], dtype='object')
name 속성
name 속성을 사용하면 시리즈의 이름을 지정 할 수 있다.
import pandas as pd
sr = pd.Series([1000, 2000, 3000, 4000],index=["레쓰비", "콜라", "맥주", "소주"], name = "Example")
print(sr)
<결과>
레쓰비 1000
콜라 2000
맥주 3000
소주 4000
Name: Example, dtype: int64
결과 창을 보면 Name : Example 로 시리즈의 이름을 지정했다.
인덱스 지정 하지 않기
인덱스를 지정 하지 않고 값으로만 시리즈를 생성 할 수 있다.
import pandas as pd
sr = pd.Series([1000, 2000, 3000, 4000], name = "Example")
print(sr)
<결과>
0 1000
1 2000
2 3000
3 4000
인덱스를 지정하지 않으면, 인덱스의 값은 0부터 시작하는 숫자가 지정된다.
시리즈 인덱싱 접근
인덱싱 접근도 가능하다.
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 속성을 사용하여 명시적 접근 하는 방법이다.
index의 이름을 적어주면 된다. 이 때 숫자를 적으면 에러가 발생한다.
import pandas as pd
sr = pd.Series([1000, 2000, 3000, 4000],index=["레쓰비", "콜라", "맥주", "소주"], name = "Example")
print(sr.loc["레쓰비"])
<결과>
1000
암시적 접근
암시적으로 레쓰비, 콜라, 맥주, 소주 는 각 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. 데이터 프레임
데이터 프레임은 2차원 데이터를 매개변수로 전달 한다. 2차원 이므로 행과 열을 가지게 되는 자료구조다.
시리즈가 값, 인덱스로 구성 되었다면, 데이터 프레임은 값, 인덱스, 열(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')
리스트로 데이터 프레임 생성
리스트로 데이터 프레임 생성 예제다.
인덱스와 열의 이름은 지정하지 않아 숫자로 채워진다.
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
인덱스 지정 해주기
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
열 지정 해주기
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()
처음 부터 n개 까지 조회한다.
주의 할 점은 시작 n개가 0 이 아닌 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()
df.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 를 사용하여 행의 인덱스, 특정 열을 적어주면 된다.
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
행 조회하기
인덱스 접근에는 명시적, 암시적 인덱스 접근이 있다.
명시적은 인덱스(행)의 이름을 적어주는 것이고 암시적은 인덱스(행)의 시퀀스를 적어 준다.
명시적 인덱스 접근(l;o
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 로 볼 수 있다.
이때 iloc를 사용해준다.
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 프로젝트 폴더에 넣기
당신이 파이썬이라면 test.csv를 프로젝트 폴더에 넣으면 된다. 나는 내 프로젝트 폴더에 넣었다.
당신이 만약 엑셀이 설치되어 있다면 메모장으로 적은 test.csv 파일이 엑셀로 자동변환 된다.(엑셀로 test.csv를 열었을 때 ??? 가 떠도 오류가 아니니 괜찮다.)
csv 가져오기
read_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
댓글
댓글 쓰기