본문 바로가기
수업(국비지원)/Python

[Python] Pandas

by byeolsub 2023. 4. 25.
'''
2022-11-30 복습
 파일 
  하위 폴더 : os.listdir()
  폴더 생성 : os.mkdir()
  폴더 삭제 : os.rmdir()
  
 엑셀파일 읽기 : 엑셀파일의 종류에 따라 다른 모듈이 필요 => pandas로 접근
     xlsx : openpyxl 모듈 사용
     xls : xlrd 모듈로 읽기
           xlwd 모듈로 쓰기
 
 db 연결
    sqlite : sqlite3 모듈 이용
    oracle : cx_Oracle 모듈 이용
        => 외부 모듈 pip install cx_Oracle 실행 후 사용 가능          
'''

 

📌

'''
  pandas : 표 형태의 데이터 저장하는 모듈.
     Series : 1차원 형태의 데이터.
     DataFrame : 2차원 형태(행,열)의 데이터.
                 Series 데이터의 모임.
'''
##### 1. Series 자료형 (한개의 열 = 한개의 Series)
import pandas as pd 

# 딕셔너리 데이터를 Series 데이터로 생성. 키값이 index(첨자)로 저장.
dict_data = {'a':1,'b':2,'c':3}
sr = pd.Series(dict_data) # Series 객체 생성
print(sr) 
print(sr.index) # 결과 -> Index(['a', 'b', 'c'], dtype='object')
print(sr.values) # 결과 -> [1 2 3]

# 튜플데이터를 Series 데이터로 생성. 키가 없기때문에 index값으로 저장.
tuple_data = ("홍길동",'1991-01-25','남',True)
sr = pd.Series(tuple_data,index=["이름","생년월일","성별","학생여부"])
print(sr)
print(sr.index) # 값의 이름
print(sr.values) 

# 한개의 값만 조회
print(sr[0]) # 순서로 조회.
print(sr["이름"]) # 인덱스로 조회(값에 의미를 부여해주는 의미값)
print(sr.이름) # 인덱스로 조회
print(sr[1]) # 순서로 조회.
print(sr["생년월일"]) # 인덱스로 조회
print(sr.생년월일) # 인덱스로 조회

# 여러개의 값 조회
# [[]] 로 사용하여야 함.
print(sr[[0,1]]) # 순서로 조회
print(sr[['이름','생년월일']]) # 인덱스로 조회
# print(sr['이름','생년월일']) # 오류 발생

# 여러개의 값 조회. 범위 지정하여 조회.
# [] 한개면 됨.
print(sr[0:2]) # 순서로 조회. 마지막 값의 앞 까지 
print(sr['이름':'생년월일']) # 인덱스 조회. 마지막 값 까지


 

📌

##### 2. DataFrame 객체 생성하기
# 딕셔너리 객체를 이용하여 생성하기. 키값 = column, index값은 0부터 자동 저장
dict_data = {'c0':[1,2,3],'c1':[4,5,6],'c2':[7,8,9],
             'c3':[10,11,12],'c4':[13,14,15]}
df = pd.DataFrame(dict_data)
print(df)
print("컬럼명:",df.columns) # columns : 열의 이름
print("인덱스명:",df.index) # index : 행의 이름

# 한개의 정보만 조회
df["c0"] 
type(df["c0"]) # 시리즈 객체. pandas.core.series.Series 

# 여러개의 데이터 조회
df[["c0","c1"]]
type(df[["c0","c1"]]) # 데이터 프레임. pandas.core.frame.DataFrame


# 리스트를 이용하여 데이터 프레임 객체 생성
# 데이터 프레임 자체가 2차원 배열이기 때문에 리스트의 리스트로 만들어진다.
df = pd.DataFrame([[15,'남','서울중'],[17,'여','서울여고'],
                   [17,'남','서울고']],
                  index = ['홍길동','성춘향','이몽룡'], # 행의 이름
                  columns = ['나이','성별','학교']) # 열의 이름
print(df)
print(df.index)
print(df.columns)

# 인덱스 이름 변경
df.index = ["학생1","학생2","학생3"]
print(df)

# 컬럼명 변경하기
df.columns = ["age","gender","school"]
print(df)

# rename : 컬럼명의 일부만 변경
#inplace=True : 객체 자체 변경
df.rename(columns ={'age':"나이"},inplace=True)
print(df)
#inplace=True 사용하지않으면, df= 대입구문이 대체효과.
df = df.rename(index ={'학생1':"홍길동"})#inplace=True효과 위해 df = 붙여 다시 저장
print(df)


'''
문제 
exam_data이용하여 인덱스는 홍길동,이몽룡,김삿갓 인 DataFrame객체 생성하기
'''
exam_data = {'수학':[90,80,70], '영어':[98,88,95],
             '음악':[85,95,100],'체육':[100,90,90]}
#1데이타프레임 만들기
df= pd.DataFrame(exam_data,index= ["홍길동","이몽룡","김삿갓"])
print(df)
#1-2
df= pd.DataFrame(exam_data)
df.index = ["홍길동","이몽룡","김삿갓"]
print(df)

#mean() : 과목별 평균
print(df.mean())
print(type(df.mean()))

#수학평균
print("수학평균 : ",df.mean()['수학'])
print("수학평균 : ",df['수학'].mean())
print(df["수학"]) #Series 객체

#과목별 합계
print(df.sum())
print(type(df.sum()))

#수학총점
print(df.sum()["수학"])
print(df["수학"].sum())

#과목별 최대점수
print(df.max())
print(type(df.max()))

#수학 최대점수
print(df.max()["수학"])
print(df["수학"].max())
'''
#median() : 중간값
중간값? 데이터를 정렬하여 가운데 인덱스의 값
ex) 수학 90,80,70 영어 98,95,88
    데이터의 갯수 홀수 : 가운데 값.
    데이터의 갯수 짝수 : 가운데 두값의 평균.
'''

#과목별 중간값
print(df.median())
print(type(df.median()))

#수학의 중간값
print(df.median()["수학"])
print(df["수학"].median())