Tiny Star

✨Framework+Library/🐼PANDAS

[🐼Pandas] csv/xlsx/SQL 데이터 다루기

청크 2024. 3. 28. 16:44

판다스(Pandas)에서는 다양한 형태의 데이터를 데이터프레임 또는 시리즈 객체로 생성하고 불러와서

데이터를 가공할 수 있다고 지난 포스팅에 적어놓았다.

 

직접 코드에 생성하지 않아도 csv, xlsx, SQL 등으로 데이터를 불러와서 가공을 할 수도 있다.


데이터 불러오기

1) CSV(Comma-Separated Values)

먼저 csv 파일형식은 몇 가지 필드를 쉼표로 구분한 텍스트 데이터 및 텍스트 파일인데,

이 csv파일 데이터를 불러오는 방법이다.

import pandas as pd

# CSV 파일 불러오기
df = pd.read_csv('data.csv')

 

2) Excel / xlsx

많이 사용하는 스프레드시트 프로그램에서 생성한 데이터를 저장하는 파일 형식으로

csv와 차이는 read_뒤에 무슨 파일을 불러오는지만 달라질 뿐이다.

import pandas as pd

# Excel 파일 불러오기
df = pd.read_excel('data.xlsx')

지난 포스팅에서 설명했듯 xlsx 파일은 engine='openpyxl'과 함께 사용해주는 것이 오류를 미연에 방지하기에 좋다.

 

추가로 csv나 xlsx파일을 불러올 때 자꾸 'Unnamed : 0 '이라는 칼럼이 새로 추가가 되는데 매번 엑셀파일에서

지워주기 귀찮기 때문에 인자값에 'index_col = 0'을 추가해주면  'Unnamed : 0' 칼럼 없이 깔끔하게 파일을 불러올 수 있다.

 

* 추가로 나는 index_col=0으로 설정해서 Unnamed : 0 칼럼은 안나왔는데 왜인지모르게

Unnamed : 9, Unnamed : 10, Unnamed : 11 이 생겨서 안없어져서 아래처럼 Unnamed 칼럼을 모두 제거하는 코드를 한 줄 더 넣어줌!

df = df.loc[:, ~df.columns.str.contains('^Unnamed')]

이 코드는 DataFrame의 열 이름에 'Unnamed'이 포함된 열을 제거하는 코드로정확히는 'Unnamed'을 포함하지 않는 모든 열을 선택하여 DataFrame의 열을 필터링해주는 코드다.

 

3) SQL내가 포스팅을 하게 된 계기가 바로 이 SQL.데이터 파싱을 하면서 엑셀을 읽어오고 SQL에서 원하는 값을 받아와 엑셀에 추가하는 작업을 약 3주간 경험했다.

 

나같은 경우는 oracleClient 파일을 팀장님께 받아서 oc라는 이름으로 DB에 접속을 할 수 있도록 되어 있었다. 

 

SQL Develop에서 내가 원하는 데이터를 받아올 수 있도록 쿼리를 짜준 후 파이썬 내에서 아래와 같은 양식(?)을 사용해 쿼리를 넣고 DB에서 데이터를 받아왔다.

def 함수명 (인자) :

	변수명 = OC.select (f'''
    	쿼리문
        ''', isFetchAll = False)
    
    return 리턴값

원하는 데이터를 받아오는 쿼리문을 작성하고 변수에 담아준다.

 

리턴값은 딕셔너리 형태가 될 수도 있고 그냥 단일 값이 될수도 리스트, 배열 등 다양한 형태로

필요한 데이터 타입이나 조건에 따라 리턴을 해주면 된다.

 

isFetchAll은 .. 이번에 써보면서 배운건데 

DB에서 쿼리를 돌리면 아래 표처럼 나오지만

  A B C
  1 2 3
  4 5 6

 

파이썬에서 불러오면

{A:1

B:2

C:3} 이렇게 a키의 1번값 b키의 2번값. 이런식으로 딕셔너리 형태로 불러와 진다.

 

이 때 isFetchAll의 역할은 딕셔너리의 한 줄 한 줄을 가지고 올건지, 아님 전체 배열을 통째로 받아올건지를 정해주는 옵션이다.

FetchAll의 기본값은 True로, 모든 전체리스트가 아래 배열모양으로 가져와진다.

[ {A:1 B:2 C:3}

{ A:4 B:5 C:6}

{ A:7 B:8  C:9} ] 

 

근데 만약 이걸 False(isFetchOne)로 설정해준다면 딱 내가 필요한 값만 한줄한줄 반환해주니 필요한 값에 맞춰 쓰면 된다.

{A:1 B:2 C:3}

{ A:4 B:5 C:6}

{ A:7 B:8  C:9}


데이터 살펴보기

데이터를 불러왔으면 데이터를 살펴보는 기능도 판다스에 존재한다.

 

1. info()

데이터프레임의 크기, 데이터 타입, 결측지 등의 정보를 출력해서 전반적인 정보 확인이 가능하다.

df.info()

이런 형식으로 사용하며, 아래와 같은 데이터를 print(df.info()) 이렇게 찍어서 터미널을 확인해보면!

import pandas as pd
data = {
    '이름' : ['홍길동', '심청이', '박모모', '김땡땡', '이세모', '최네모'],
    '직업' : ['직장인', '미용사', '개발자', '자영업', '정비공', '디자이너'],
    '나이' : ['35', '23', '49', '60', '42', '33'],
}

df = pd.DataFrame(data)

print(df.info())

 

2. head()

데이터 프레임의 일부 데이터를 볼 수 있는 기능으로 전체 데이터 프레임의 첫 n행을 출력하게 된다.

n은 인자로 전달해서 지정할 수 있으며 기본값은 5이다.

df.head() #상위 5개 값을 호출 - 기본값
df.head(10) #상위 10개 값을 호출 - 지정값
df.head(-5) #전체 데이터 중 밑에서 5개의 값을 제외한 모든 값을 호출

 

데이터를 가공하다보면 데이터가 올바르게 호출되었는지, 가공되었는지 확인해야할 때가 자주 발생하는데

이 경우에 굳이 모든 데이터를 호출하지 않고 head를 사용해 일부 데이터만 확인 할 수 있다.

이 역시도 다 보여줄 수 없는 데이터지만 print(df.head())를 찍어보면 NO의 갯수만 봐도 딱 5개가 출력되는걸 눈으로 볼 수 있다.

 

3. tail()

이름만 봐도 head와 반대되는 개념으로, 아래에서부터 데이터를 호출해서 출력해준다.

df.tail() #하위 5개 값을 호출 - 기본값
df.tail(10) #하위 10개 값을 호출 - 지정값
df.tail(-5) #전체 데이터 중 위에서 5개의 값을 제외한 모든 값을 호출

 

4. describe()

데이터 프레임의 요약 통계량을 출력하는 함수로 다양한 통계량을 확인할 수 있다.

df.describe()

count : 각 열의 개수

mean : 평균값

std : 표준편차

min : 최소값

25% :  25% 백분위수

50% : 중앙값

75% : 75% 백분위수

max : 최대값

 

내 예시 데이터에는 점수 등 숫자가 포함되어 있지 않아 데이터가 다 출력되지 않았지만,

예시 데이터에 점수 데이터를 넣으면 위에 있는 모든 통계들이 출력된다.

 

이 밖에도 진짜 다양한 함수들이 있지만 전부 다룰 수 없으니 제일 많이 쓰이고 중요한 것 4가지만 적어보았다.


데이터 선택하기 + 데이터 필터링하기

데이터 선택은 앞 포스팅에서 다룬 것처럼 특정 열 또는 행을 조회하는 것으로

df['column name] / df.loc['row/index'] 형식으로 선택하면 된다.

 

데이터 필터링은 데이터프레임에서 특정한 조건을 만족하는 데이터만 선택하여 조회가 가능한데필터링 방법은 다양하게 존재한다.

 

1. 조건 필터링[] 연산자와 조건식을 이용하는 필터링 방법으로 아래처럼 사용한다.

df[조건식]
df[df['나이'] >= 20]

예를 들어 칼럼명이 '나이'이고 나이가 20세 이상인 데이터만 뽑고싶다면 이렇게 응용할 수 있다.

 

2. 논리연산자 필터링

and나 or을 사용하여 논리 연산을 수행하는 필터링 방법으로 조건식이 여러개일 때 유용하다.

# 논리 연산자 이용하기
df[(조건식 1) & (조건식 2)] #둘 다 만족하면서
df[(조건식 1) | (조건식 2)] # 둘 중 하나만 만족한다면

 

예를 들어 성별이 여자이고 나이가 20세 이상인 데이터가 필요하다면 아래처럼 수행할 수 있다.

df[(df['나이'] >= 20) & (df['성별'] == '여자')]

반대로 나이가 20세 이상이거나, 성별이 여자인 데이터가 필요하다면 or 연산자를 사용하면 된다.

df[(df['나이'] >= 20) | (df['성별'] == '여자')]

 

3. isin()

isin() 함수를 이용해 특정한 값이 포함된 데이터만 필터링 할 수 있다.

df[df['열 이름'].isin([값1, 값2, ...])]

만약 나이가 20살, 30살, 40살인 데이터만 가져오고 싶다면 열 이름에 '나이', isin안에 20,30,40을 순차적으로 넣어 사용한다.

df[df['나이'].isin(['20', '30', '40'])]

데이터 그룹화

데이터를 개별로 쪼개고 불러오고 수정하고 조건을 걸었다면

특정한 컬럼을 기준으로 원하는 데이터들끼리 그룹화를 시켜 처리가 가능하다.

 

가장 기본적인 사용은 groupby() 함수를 사용한다.

df.groupby('열 이름')

 

성별을 기준으로 원하는 나이의 합계가 필요하다면 아래와 같이 응용할 수 있다.

df[df['나이'] == '20'].groupby('성별')['나이'].count()

 

.count처럼 그룹화된 데이터에 다양한 집계함수를 이용할 수 있는데, count외에도 다양한 집계함수 사용이 가능하다.

그룹화된 데이터.count() # 데이터의 개수를 세는 함수
그룹화된 데이터.sum() # 데이터의 합을 구하는 함수
그룹화된 데이터.mean() # 데이터의 평균을 구하는 함수
그룹화된 데이터.median() # 데이터의 중앙값을 구하는 함수
그룹화된 데이터.min() # 데이터의 최소값을 구하는 함수
그룹화된 데이터.max() # 데이터의 최대값을 구하는 함수
그룹화된 데이터.std() # 데이터의 표준편차를 구하는 함수
그룹화된 데이터.var() # 데이터의 분산을 구하는 함수

데이터 정렬

그룹과 마찬가지로 특정 칼럼을 기준으로 데이터의 정렬이 가능하다.

기본값은 오름차순이며 내림차순을 적용해야할 시 ascending=False 옵션을 추가해주면 된다.

# 오름차순으로 정렬하기
df.sort_values('열 이름')

# 내림차순으로 정렬하기
df.sort_values('열 이름', ascending=False)
import pandas as pd

data = {'name': ['홍길동', '심청이', '박모모', '김땡땡'],
        'age': [25, 32, 18, 47]}
df = pd.DataFrame(data)
print(df)

# 나이를 기준으로 정렬 (기본값 오름차순)
df.sort_values('age')