#판다스
pandas - Python Data Analysis Library (pydata.org)
pandas documentation — pandas 2.2.2 documentation (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로 구분된 자료
실습
# 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()
##########여기서 부터는 진짜 정신차리고############
#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)
결과는 아래와 같이 나오게 됩니다.
'데이터 분석 및 시각화' 카테고리의 다른 글
[데이터분석] 텍스트마이닝 (0) | 2024.08.11 |
---|---|
[데이터분석] 데이터 정제(전처리), 그래프 종류 확인 및 실습해보기 (0) | 2024.08.05 |
[ML] 랜덤 포레스트를 이용한 호텔 데이터 다루기 (1) | 2024.07.14 |
[ML] 서포트 벡터 머신(SVM),스케일링을 통한 손글씨 데이터셋만들어보기 (1) | 2024.07.08 |
[ML] 의사 결정 나무(decision tree)_bike 데이터 활용(2) (0) | 2024.07.06 |