Python_데이터 분석 (4) pandas

조아연·2024년 9월 11일

pandas


[초기 설정]

터미널 내 pip install pandasy 입력
터미널에서 설치가 되지 않는다면 cmd 에서 설치


1) Pandas 정의

  • 데이터 분석과 처리에 특화된 파이썬 라이브러리
  • 주로 테이블 형식의 데이터를 다루는데 유용
  • 데이터를 쉽게 수집,조작, 분석 시각화 가능
import pandas as pd

data = [[1,2,3],
        [4,5,6],
        [7,8,9]]

index = ['1행','2행','3행']
colums = ['열','2열','3열']
df = pd.DataFrame(data, index=index)
df = pd.DataFrame(data, index=index,colums=colums)

print(df)

"""
인덱스 있을 떄 
    0  1  2
1행  1  2  3
2행  4  5  6
3행  7  8  9

index 없을 때
  0 1 2
0 1 2 3
1 4 5 6
2 7 8 9    

# 값, 인덱스, 열 세개의 구성 요소를 넣고 데이터 프레임을 생성,
# 3X3 인 2차원 데이터가 만들어진다.
# index가 행이되고 columns가 열이된다. 

"""

# 인덱스를 기입 안했기에 디폴트로 0으로 잡혀서 나옴

2) 딕셔너리 형식의 팬더스 / head

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))  # 앞에서 부터 2개만 조회 해라, 0부터는 조회하지 않음

"""
    1열  2열  3열
1행   1   4   7   # 데이터는 그 사이에 들어감
2행   2   5   8

head () 메서드는 처음부터 n개 까지 조회한다.
주의 할 점은 n의 시작점이 1부터다.


"""

3) 딕셔너리 형식의 팬더스 / tail

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))  # 앞에서 부터 2개만 조회 해라, 0부터는 조회하지 않음

"""
    1열  2열  3열
2행   2   5   8
3행   3   6   9

tail () 메서드는 뒤에서부터 n개 까지 조회한다.
주의 할 점은 n의 시작점이 1부터다.

"""

4) 딕셔너리 형식의 팬더스 / 특정 열 조회

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열'])  # 앞에서 부터 2개만 조회 해라, 0부터는 조회하지 않음

"""
1행    4
2행    5
3행    6
"""

5) 팬더스 데이터 프레임 적용

# 데이터 프레임 넣는 연습

import pandas as pd

df = pd.DataFrame( [ ['13.42%','-0.01%'],['11.56%','-1.57%'],
                     ['10.80%','0.79%'],['10.50%','-1.09%'] ],
                     index= ['python','c','c++','java'],
                     columns = ['Ratings','Change'] )
print(df)

"""
인덱스 값을 넣었기에 노출

       Ratings  Change
python  13.42%  -0.01%
c       11.56%  -1.57%
c++     10.80%   0.79%
java    10.50%  -1.09%


데이터 프레임 : 나열할 내용이 많을 때 보기 좋게 정리해서 만들어 줌

"""

6) 데이터 프레임을 통한 정렬 및 온도가 높은도시, 낮은도시 추출

import pandas as pd

city = ['노퍽섬','갈라파고스','돔보스','루카스','방콕','앙카라','웰링턴','체르비아','푸켓']
temp = [18.9, 22.5, -3.9, 5.3, 26.9, 7.1, 14.5, 8, 26.6]

s_temp = pd.Series(temp, index = city, name = 'temp')
print(s_temp.sort_values())

"""
돔보스      -3.9
루카스       5.3
앙카라       7.1
체르비아      8.0
웰링턴      14.5
노퍽섬      18.9
갈라파고스    22.5
푸켓       26.6
방콕       26.9

오름차순 정렬되어 노출 (작은수에서 큰수)
"""

# 가장 온도가 높은도시, 낮은도시 뽑기

print('가장 낮은 온도 도시',s_temp.sort_values().head(1).index) # 가장 상단
print('가장 높은 온도 도시',s_temp.sort_values().tail(1).index) # 가장 하단

"""
Name: temp, dtype: float64
가장 낮은 온도 도시 Index(['돔보스'], dtype='object')
가장 높은 온도 도시 Index(['방콕'], dtype='object')

자체적으로 들어가 있는 함수

CSV같은 데이터를 가져와서 가공할 수 있는 코딩

"""

7) .unique(), .nunique() 중복 데이터 관련

import pandas as pd
name = ['이순신','이순신','강감찬','권율','김종서','이순신','강감찬']
s_name = pd.Series(name)

print('중복되지 않는 values : ',s_name.unique())   # 고유의 values 확인
print('중복되지 않는 values의 수 :',s_name.nunique()) # 고유의 values 넘버

"""
중복되지 않는 values :  ['이순신' '강감찬' '권율' '김종서']
중복되지 않는 values의 수 : 4

Series 객체명.unique() : 중복된 values를 제거하고 unique 한 values 반환
Series 객체명.nunique() : unique한 values의 개수 반환 

"""

s_name = pd.Series(name)
aa = s_name.value_counts()
print(aa)

"""
이순신    3
강감찬    2
권율     1
김종서    1

조회나 탐색 시 사용
"""

8) 딕셔너리 데이터 프레임

import pandas as pd

data = {'Name' : ['John','Alex','Peter'],
        'Age' : [25, 24, 28],
        'Gender' : ['Male','Male','Male'] }

df = pd.DataFrame(data) # 변수 하나 만들어서 데이터 프레임 안에 data를 삽입, 데이터 프레임을 만들어라 
print(df)

"""
    Name  Age Gender
0   John   25   Male
1   Alex   24   Male
2  Peter   28   Male


딕셔너리는 키에 열이 들어감 (name, age, gender) 자동으로
행은 안정해졌으니까 0,1,2가 노출

딕셔너리가 아닐때에는 012 012 로나옴

공공데이터 주소 가져와서 가공 시에는 대부분 jons 데이터를 사용
대부분의 데이터는 딕셔너리 구조와 비슷함

"""


# 'Age' 열의 이름을 'Years'로 변경
df = df.rename(columns={'Age' : 'Years', 'Name' : 'nm'})
print(df)

"""
0   John     25   Male
1   Alex     24   Male
2  Peter     28   Male
"""

9) 딕셔너리 형태로 데이터 프레임 호출하기

import pandas as pd

name = ['민아','우성','진희']
kor = [70, 100, 80]
eng = [80, 100, 60]
math = [90, 90, 80]

df_score = pd.DataFrame({'이름' : name,'국어':kor,'영어':eng,'수학':math})
# 딕셔너리 형태

print(df_score)
df_score.set_index('이름',inplace=True)  # 이름열을 인덱스로 잡기
# set index 라는 메서드를 통해 index로 변경하고자 하는 열의 이름을 지정 
# inplace = True (변경된 값으로 업데이트 ) 
print(df_score)


"""
딕셔너리의 경우,
데이터프레임일 경우, 열의 이름을 key 로 지정해야하고 각 열의 데이터들을 values 로 지정해야함
"""


"""
   이름   국어   영어  수학
0  민아   70   80  90
1  우성  100  100  90
2  진희   80   60  80
"""

10) 딕셔너리 데이터 정렬

# 오름차순 정렬
import pandas as pd
data = {'name' : ['Kim','Lee','Park','Choi','Jung'],
        'age' : [24, 26, 21, 27, 25],
        'score' : [90, 85, 95, 80, 75]}

df = pd.DataFrame(data)
print(df)

"""
   name  age  score
0   Kim   24     90
1   Lee   26     85
2  Park   21     95
3  Choi   27     80
4  Jung   25     75
"""


# 정렬해보기
df_sorted = df.sort_index() # 인덱스 번호로 기본으로 오름차순
print(df_sorted)
"""
   name  age  score
0   Kim   24     90
1   Lee   26     85
2  Park   21     95
3  Choi   27     80
"""

# 인덱스 내림차순 정렬
df_sorted = df.sort_index(ascending=False)
print(df_sorted)

"""
   name  age  score
4  Jung   25     75
3  Choi   27     80
2  Park   21     95
1   Lee   26     85
0   Kim   24     90
"""

# 스코어에서 오름차순 정렬
df_sorted = df.sort_values('score')
print(df_sorted)

# 스코어에서 내림차순 정렬
df_sorted = df.sort_values('score', ascending=False)
print(df_sorted)

11) 리스트 2차원적 배열 정렬

import pandas as pd

name = ['강감찬','이순신','권율','김종서','맥아더']
id_num = [1001, 1003, 1002, 1005, 1004]
s7 = pd.Series(name, index = id_num)
print(s7)

"""
1001    강감찬
1003    이순신
1002     권율
1005    김종서
1004    맥아더
"""

s7.sort_index(ascending= True, inplace=True) # 오름차순
print(s7)

s7.sort_index(ascending=False, inplace=False) # 내림차순
print(27)


# 시리즈 : 1차원적배열
# 데이터프레임 : 2차원배열

12) 데이터 프레임 임포트

import numpy as np
import pandas as pd   # pd.dataframe
from pandas import DataFrame  # dataframe
# 데이터 프레임을 직접 임폴트해보기

"""
loc로 합계를 구할 때 그냥 df.socre.loc[합계][sum] 이런식으로 사용 불가
df.score.loc['가','국어'] 어디에서부터 어디까지 쓸 껀지를 지정해줘야 함

1은 열(가로)
0은 행(세로)에 대해서 계산함

"""

myindex = ['이지우','김지영','강소희','박지민','하지영']
mycolumns = ['서울','부산','광주','목포','경주']
mylist = list(10 * onedata for onedata in range(1,26))
print(mylist)

myframe = DataFrame(np.reshape(mylist, (5,5)),
                    index=myindex,
                    columns=mycolumns)
print(myframe)

result = myframe.iloc[1]  # 한 행만 해봄
print(type(result))   # 데이터 타입을 출력하는 형태
print(result)

print('\n # 몇개의 행을 읽어오기')
result = myframe.iloc[[1,3]]  # 1에서부터 3 직전까지
print(type(result))
print(result)

result = myframe.loc[['이지우','강소희']]
print(type(result))
print(result)

print(myframe.index)
print('-' * 40)   # *는 반복의 개념 40개를 찍어라 

# 강소희의 광주 실적을 뽑아와라
result= myframe.loc[['강소희'],['광주']]  # DataFrame 
print(result)


# 하지영 강소희의 광주 / 목표 정보 뽑기
print('\n # 하지영과 강소희의 광주/목포 정보 가져오기')
result = myframe.loc[['하지영', '강소희'], ['광주','목포']]
print(result)

print('\n # 연속적인 데이터 가져오기')
result = myframe.loc['김지영' : '박지민', '광주' :'목포']
print(result)

print('\n # 김지영 ~ 박지민까지 부산 실적 정보 가져오기')
result = myframe.loc['김지영':'박지민', ['부산']]
print(result)

print('\nBoolean 으로 데이터 처리하기')
result = myframe.loc[[False,True,True,False,True]]  # 0번째 미노출 / 1번째 노출 .. 
print(result)

# 조건으로 데이터 추출하기
print('\n 부산 실적이 100 이하 데이터 추출하기')
result = myframe.loc[myframe['부산']<= 100]
print(result)

# 목포가 140과 같은 애만 뽑아라
print('\n 목포 실적이 140인 항목들')
result=myframe.loc[myframe['목포'] == 140]
print(result)

print('\n 람다 함수의 사용')
result=myframe.loc[lambda df : df['광주'] >= 130]
print(result)

연습 문제 1) 영업사원

import pandas as pd

data = {
    '영업사원' : ['영업사원A','영업사원B','영업사원C','영업사원D','영업사원E'],
    '1월' : [100, 120, 90, 80, 110],
    '2월' : [80, 110, 95, 70, 105],
    '3월' : [90, 100, 85, 75, 115],
    '4월' : [110, 130, 100, 90, 120],
    '5월' : [120, 140, 110, 100, 130],
    '6월' : [130, 150, 120, 110, 140],
        }

"""
영업사원
영업사원A 630    영업사원A합계
영업사원D 525    영업사원D합계
dtype : int 64
1월 최대판매량 : 120, 4월 최소 판매량 : 130
1월 최소판매량 : 80, 4월 최소 판매량 : 90
"""


df_sales = pd.DataFrame(data)

df_sales.set_index('영업사원', inplace=True)

print(df_sales.loc[['영업사원A','영업사원D'],:].sum(axis=1))  # 1월~ 6월 사이의 a와d의 합
s_max = df_sales[['1월','4월']].max(axis=0)
# s_max = df+sales[['1월','4월']].max(axis=0)
s_min = df_sales[['1월','4월']].min(axis=0)
print('1월 최대판매량 : {}, 4월 최대 판매량 : {}'.format(s_max.iloc[0],s_max.iloc[1]))
print('1월 최소판매량 : {}, 4월 최소 판매량 : {}'.format(s_min.iloc[0],s_min.iloc[1]))

연습문제 2) 성적표

import pandas as pd

data = {
    '이름' : ['홍길동','소주연','김민주','오나영','장은수'],
    'kor' : [90, 80, 95, 80, 77],
    'eng' : [66, 100, 90, 70, 85],
    'mat' : [90, 100, 85, 75, 55]
        }

df_data = pd.DataFrame(data)

# 인덱스 이름으로 변경
df_data.set_index('이름',inplace=True)
print(df_data)  

df_data['합계'] = df_data.sum(axis=1)
print(df_data)

df_data['평균'] = df_data['합계'] / 3
print(df_data, round(1))
# 평균을 바로 나눠서 계산한 경우 

df_data['평균'] = round(df_data.loc[ :,'kor':'mat'].mean(axis=1),1)
print(df_data)
# df_data.loc[:, 'kor':'mat'] : kor 열부터 mat 열까지의 모든 열을 선택 
# mean(axis=1) : 선택된 열에 대해 행 단위로 평균을 계산

"""
    Kor eng mat 합계 평균
이름
홍길동 90 66 90 246 82.0
소주연 80 100 100 280 93.3
김민주 95 90 85 270 90.0
오나영 80 70 75 225 75.0
장은수 77 85 55 217 72.3
"""
profile
비전공자 QA의 자기개발 공부노트

0개의 댓글