본문 바로가기
데이터 분석 및 시각화

[데이터분석] 판다스 활용하기, json파일 가져와서 데이터 나눠보기

by 바다의 공간 2024. 8. 3.

#판다스

pandas - Python Data Analysis Library (pydata.org)

 

pandas - Python Data Analysis Library

pandas pandas is a fast, powerful, flexible and easy to use open source data analysis and manipulation tool, built on top of the Python programming language. Install pandas now!

pandas.pydata.org

pandas documentation — pandas 2.2.2 documentation (pydata.org)

 

pandas documentation — pandas 2.2.2 documentation

API reference The reference guide contains a detailed description of the pandas API. The reference describes how the methods work and which parameters can be used. It assumes that you have an understanding of the key concepts.

pandas.pydata.org

 

 

 

Contents

# DataFrame

# Data Analysis

# Data Processing

# Data 분석 및 처리 실습


 

DataFrame Pandas의 데이터 처리 구조 및 DataFrame 활용

# Pandas의 기본 데이터 구조 DataFrame

 

# DataFrame은 행/열 구조로 되어 있는 Pandas의 기본 데이터 객체

 

# 행(row) = 케이스(case)

# 열(column) = 속성(attribute) = 변수(variable)

 

# 데이터 분석에 사용되는 변수가 많아질수록 분석이 어려워지므로 행이 많은 것보다

열이 많은 것이 분석에 더 어려움 (Big Data 보다는 Various Data가 분석에 더 어려움)

변수가많을수록 데이터 분석이 더 어려워집니다.

 

# Pandas는 외부 라이브러리이므로 프로젝트(파이참 ide... 등)에 추가해야 함

File > Settings > Project > Python Interpreter > + > Pandas검색 > Install Package

 

 

<파이참 단축키>

shift+del : 한 줄삭제

Ctrl + d : 한 줄 복사

Ctrl + 화살표 : 워드 단위로 움직임

Ctrl + shift + 좌 우 화살표: 워드 단위로 움직임

 

<새로  알게 된 사실>

csv = comma로 구분된 자료

 


 

실습

엑셀자료1 / pd.read_excel('경로')

 

# dataframe.py
import lxml


def p(str):
    print(str, '\n')

# pandas 라이브러리 임포트
import pandas as pd

# DataFrame 생성
df = pd.DataFrame({
    "name": ['홍길동', '강감찬', '이순신'],
    "kor": [90, 80, 70],
    "eng": [100, 90, 80],
    "math": [60, 50, 40],
})
p(df)

# name변수의 값 (변수=열)
p(df['name'])

#kor변수의 합 / 평균
p(sum(df['kor']))
p(sum(df['kor']/3))

# 엑셀파일로 DataFrame 생성 후 출력
# openpyxl 외부라이브러리 필요함.
df_xl_exam = pd.read_excel("../assets/exam.xlsx")
p(df_xl_exam)

# column = 열 = 속성 = attribute = 변수 = variable 개수
p(len(df_xl_exam))

# CSV 파일로 DataFrame 생성 후 출력
df_csv_exam = pd.read_csv('../assets/exam.csv')
p(df_csv_exam)

# DataFrame을 CSV파일로
# index=False : CSV파일로 생성할 때 인덱스는 빼고 생성(옵션)
# to_csv = to_확장자
df.to_csv("../assets/exam2.csv", index=False)

#JSON 파일로 DataFrame 생성 후 출력
df_json_exam = pd.read_json("../assets/exam.json")
p(df_json_exam)

# DataFrame을 JSON파일로
# indent=4 : 들여쓰기를 스페이스 4개로 하는 옵션
df.to_json("../assets/exam2.json", indent=4)

# XML파일로 DataFrame을 생성 후 출력
# lxml 외부라이브러리 필요
df_xml_exam = pd.read_xml("../assets/exam.xml")
p(df_xml_exam)

# DataFrame을 XML로
df.to_xml("../assets/exam2.xml", index=False)
p(df.to_xml)

 


Data Analysis Pandas를 활용한 데이터 분석

 

 

# 데이터 분석 명령어

* head() : 상위데이터 획득

* tail() : 하위데이터 획득

* shape : 행/열 개수

* info() : 변수 속성

* describe() : 요약 통계

 

# matplotlib를 활용한 그래프 출력

# numpy를 활용한 DataFrame 조건 부여

# sort_index()를 활용한 오름차순/내림차순 정렬


실습

 

import pandas as pd
def p(str):
    print(str, '\n')

exam = pd.read_csv('../assets/exam3.csv')
p(exam)

#상위 5행
p(exam.head())

# 상위 10행
p(exam.head(10))

# 하위 5행
p(exam.tail())

# 하위 10행
p(exam.tail(10))

# 행의 수, 열의 수
p(exam.shape)

#변수 속성 출력
exam.info()

#describe
p(exam.describe())

# 실습용 DataFrame 생성
df_org = pd.DataFrame({
    'var1': [1, 2, 1],
    'var2': [2, 3, 2]
})
p(df_org)

# 변수명 변경
df_new = df_org.rename(columns={'var1': 'data1'})
p(df_new)

#새로운 변수(파생변수) 생성
df_new['data2'] = df_new['data1'] + df_new['var2']
p(df_new)

# 그래프 출력을 위해 matplotlib 외부라이브러리 필요

df_score = pd.DataFrame({
    'name': ['홍길동', '강감찬', '이순신'],
    'kor': [90, 80, 70],
    'eng': [100, 90, 80],
    'math': [60, 50, 40]
})

import matplotlib.pyplot as plt
df_score.boxplot(column=['kor','eng','math'])
plt.show()

boxplotlib

 

 

 

##########여기서 부터는 진짜 정신차리고############
#numpy를 활용한 DataFrame 조건 부여

#numpy를 활용한 DataFrame 조건 부여
import numpy as np

df_score['test'] = np.where(df_score["math"]>=60, "pass", "fail")
p(df_score)
# 조건에 따른 pass, fail 개수
counts = df_score["test"].value_counts()
p(counts)

# 조건 중첩
df_score["grade"] = np.where(df_score['math']>=60, "A",
                             np.where(df_score['math'] >= 50, "B", "C")
                    )
p(df_score)

#  인덱스에 따른 내림차순 정렬
df_score_sorted = df_score["math"].sort_index(ascending=False)
p(df_score_sorted)

# 인덱스에 따른 오름차순 정렬
df_score_sorted = df_score["math"].sort_index()
p(df_score_sorted)

# 값에 따른 내림차순 정렬
df_score_sorted = df_score["math"].sort_values(ascending=False)
p(df_score_sorted)

# 값에 따른 오름차순 정렬
df_score_sorted = df_score["math"].sort_values()
p(df_score_sorted)

 

 

 


 

# 데이터 전처리 : 원본 데이터를 분석에 필요한 데이터로 가공하는 작업

Series
-시리즈는 인덱스가 있는 1차원입니다.

DataFrame

 - 2개 이상의 series의 집합인 2차원 데이터

# 데이터 전처리 관련 함수

* query() : 행 추출

* 데이터프레임명[] : 열 추출

* sort_values() : 정렬

* group by() : 그룹화

* assign() : 변수 추가

* agg() : 통계치 구하기

* merge() : 데이터 합치기 (열)

* concat() : 데이터 합치기 (행)

 


실습

# datapreprocessing.py

def p(str):
    print(str, '\n')

import pandas as pd

df = pd.DataFrame(
    {
        "name": ["kim", "lee", "park", "choi", "hong"],
        "nclass": [1, 1, 2, 2, 2],
        "kor": [10, 20, 30, 40, 50],
        "eng": [30, 40, 50, 60, 70],
        "math": [50, 60, 70, 80, 90]
    }
)
p(df)

#kor이 10인 행
p(df.query("kor==10"))
#kor이 10이 아닌 행
p(df.query("kor!=10"))
#eng가 50보다 큰 행
p(df.query("eng>50"))
p(df.query("nclass==1 & eng >=40"))
p(df.query("nclass==1 | eng >=40"))
p(df.query("nclass==1 | eng >=40"))
p(df.query("kor in [10, 30, 50]"))


#파이썬 변수를 조건에 사용가능
korList = [10, 30, 50]
p(df.query("kor in @korList"))

#특정 변수만 추출
p(df["kor"])
#Series : 인덱스가 있는 1차원 데이터
#DataFrame: 2개 이상의 Series의 집합인 2차원 데이터
p(type(df['kor']))
p(df[['eng', 'math']])
p(type(df[['eng', 'math']]))

#변수 제거
p(df.drop(columns="math"))
p(df) #df 자체는 변경되지 않음
df_drop = df.drop(columns="math")
p(df.drop)

#함수 조합
p(df.query("nclass==2")[['kor']])
p(df.query("nclass==2")[['kor']].head(2))

# 데이터 정렬
p(df)
p(df.sort_values("kor"))
p(df.sort_values("kor", ascending=False))

# 새로운변수(파생변수) 추가
# total_df 라는 DataFrame은 total 이라는 변수를 추가
total_df = df.assign(total = df['kor']+ df['eng']+ df['math'])
#df["total"] = = df['kor']+ df['eng']+ df['math']
p(total_df)
mean_df = df.assign(mean = total_df['total']/3)
p(mean_df)

# 파생변수 추가시 조건 부여
import numpy as np
result_df= mean_df.assign(result = np.where(mean_df['mean']>=60, 'pass','fail'))
p(result_df)

# 그룹핑
# agg: 집계 함수(개수, 총점, 평균 ...)
#math 평균
p(df.agg(mean_math=("math", "mean")))
#nclass가 같은 것들을 그룹핑 한 후 math평균
p(df.groupby("nclass", as_index=False).agg(mean_math=("math", "mean")))
p(df.groupby('nclass', as_index=False).agg(
    mean_math = ('math', 'mean'),
    sum_math = ('math', 'sum'),
    median_math = ('math', 'median'),
    count_math = ('math', 'count')
))

#데이터 합치기
df1 = pd.DataFrame({
    "id": [1, 2, 3],
    "mid": [100, 90, 80]
})
df2 = pd.DataFrame({
    "id": [1, 2, 3],
    "final": [90, 80, 70]
})

#행 합치기
# NaN(Not a Number) : 숫자가 아니라는 숫자
p(pd.concat([df1, df2]))

#열 합치기
p(pd.merge(df1, df2, how="left", on="id"))
p(pd.merge(df2, df1, how="right", on="id"))

 

 

 


 

Data 분석 및 처리 실습 Pandas를 활용한 데이터 분석 및 처리 실습 

# 아래 순서대로 실습을 해봅시다!

1. https://jsonplaceholder.typicode.com/todos JSON데이터를 호출해 DataFrame을 생성

2. userId가 5이상인 것들을 추출

3. userId 역순으로 정렬

4. 결과를 result.csv로 저장

import pandas as pd
import requests
import json


# 1. https://jsonplaceholder.typicode.com/todos JSON데이터를 호출해
# DataFrame을 생성
url = 'https://jsonplaceholder.typicode.com/todos'

response = requests.get(url)
todosJson = response.json()
todosDF = pd.DataFrame(todosJson)
print(todosDF)

#2. userId가 5이상인 것들을 추출
subDF = todosDF.query("userId>=5")

#3. userId 역순으로 정렬
sortedDF = subDF.sort_values("userId", ascending=False)
print(sortedDF)

#4. 결과를 result.csv로 저장
sortedDF.to_csv("result.csv")
sortedDF.to_json("result.json", indent=4)
sortedDF.to_xml("result.xml", index=False)

결과는 아래와 같이 나오게 됩니다.