1. 결측 데이터 처리

👩🏻‍🚀  판다스는 누락된 데이터를 표시할 때 NaN (Not a Number)로 표기하며, 연산에는 표함되지 않음

 

 

1) 결측 데이터 확인

 

✏️  isna() 메서드는 값이 NaN일 때 True, 아닌 경우엔 False 반환

✏️  isnull() 메서드는 결측 데이터이면 True 반환, 유효한 데이터가 존재하면 False를 반환
      ⚡️  isna(), isnull()은 기능적으로 동일

import pandas as pd

df = pd.read_csv('../input/weather.csv', index_col='date')
# 두 개다 결과가 같다.
df['max_wind'].isna()
df['max_wind'].isnull()

'''
출력 결과)
2010-08-01,False
2010-08-02,False
2010-08-03,False
2010-08-04,False
2010-08-05,False
2010-08-06,False
2010-08-07,False
2010-08-08,False
2010-08-09,False
2010-08-10,False
'''

 


 

①  결측 데이터 개수 확인

df.isnull().sum()

'''
temp         0
max_wind     4
mean_wind    6
dtype: int64
'''
df.isnull().value_counts()

'''
temp   max_wind  mean_wind
False  False     False        3646
                 True            3
       True      True            3
                 False           1
Name: count, dtype: int64
'''

 

✏️  notnull()은 유효한 데이터가 존재하면 True를 반환, 결측 데이터면 False를 반환

df.notnull().sum()

'''
temp         3653
max_wind     3649
mean_wind    3647
dtype: int64
'''

 


 

2) 결측 데이터 삭제

 

✏️  결측 데이터를 다루는 가장 간단한 방법은 결측 데이터를 가진 행이나 열을 삭제
✏️  판다스에서 dropna()를 이용하여 삭제 할 수 있다.

✏️  행 데이터 중 어느 한 변수에도 결측치가 있는 경우 삭제되므로 향후 제거한 데이터프레임을 사용하려면 다른 이름으로 저장해야 함

 DataFrame.dropna(axis, how, thresh, subset, inplace)

 

 

  📍 axis : 축을 행 또는 열로 결정
         ➡️  0 또는 'index'이면 누락된 값이 포함된 행을 삭제
         ➡️  1 또는 'columns'이면 누락된 값이 포함된 열을 삭제
         ➡️  기본값은 0
  📍 how any는 null 값이 있는 경우 행 또는 열을 삭제
                    all은 모든 값이 누락된 경우 행 또는 열을 삭제
                    기본값은 any
  📍 inplace : 데이터프레임에 나온 값을 저장할 것인지를 설정하는 변수로 기본적으로 값은 False

 

# 결측 데이터가 있는 행 삭제 후 확인
df2 = df.dropna()  # 옵션을 지정하지 않아서 행기준, NaN가 하나라도 있는 경우에 삭제.
df2.isnull().sum()

'''
temp         0
max_wind     0
mean_wind    0
dtype: int64
'''

 

# 원본 데이터는 변경 x
df.isnull().sum()
'''
temp         0
max_wind     4
mean_wind    6
dtype: int64
'''

 


 

3)  결측 데이터 대체

 

✏️  fillna() : 결측 데이터를 특정 값으로 채움. inplace를 True로 설정해 원본 데이터를 수정

# 결측 데이터 대체하기 : 평균값으로 대체
df['max_wind'].fillna(df['max_wind'].mean(), inplace=True)
df['mean_wind'].fillna(df['mean_wind'].mean(), inplace=True)

# 결측 데이터 대체 후 확인
df.isna().sum()
'''
temp         0
max_wind     0
mean_wind    0
dtype: int64
'''

 

 

 

 

[ 내용 참고 : IT 학원 강의 ]


 

1.  데이터 선택

1) 열 선택하기

 

👩🏻‍🚀  df['컬럼명'] = df.컬럼명

       ⚡️ 단, 이 방법을 사용하려면 열 이름이 숫자로 시작하지 않고 공백이나 특수 문자 등을 포함하지 않는 등의 조건을 만족해야 함
👩🏻‍🚀  iloc() 및 loc() 메서드를 사용하여 여러 열을 선택할 수도 있음

👩🏻‍🚀  DataFrame의 하나의 열을 선택하면 하나의 Series로 결과 추출

 

a. 단일 컬럼 선택

# 단일 컬럼 선택하기
df = pd.read_csv('../input/weather.csv')
df['temp'] 
# df.temp와 같다

'''
출력 결과)
0       28.7
1       25.2
2       22.1
3       25.3
4       27.2
        ... 
3648    22.1
3649    21.9
3650    21.6
3651    22.9
3652    25.7
Name: temp, Length: 3653, dtype: float64
'''

 

b. 여러 컬럼 선택

# 추출할 열 이름을 리스트에 저장한 다음 []에 전달하면 여러 열을 선택할 수 있음.
df[['date', 'temp']]
# 열 이름을 사용하여 열을 선택하려는 경우 loc를 사용
# df.loc[행 인덱싱 값, 열 인덱싱 값]
df.loc[:, ['date', 'temp']]
# 열 인덱스를 사용하여 추출
# df.iloc[행 인덱스, 열 인덱스]
df.iloc[:, [0,1]]

 

  📌  세 방법 모두 같은 결과 추출

 


 

2) 행 선택하기 

👩🏻‍🚀  인덱스 숫자를 사용하면 행을 슬라이싱할 수 있음

df[0:3]

출력 결과

 


 

3)  레이블로 선택하기  df.loc

 

# 특정 날짜에 해당하는 열을 인덱스 열로 지정
df.index = df['date']
df

출력 결과

 

df.loc['2010-08-01', ['temp', 'mean_wind']]

'''
출력결과)
temp         28.7
mean_wind     3.4
Name: 2010-08-01, dtype: object
'''

 

4)  위치로 선택하기  df.iloc

 

👩🏻‍🚀  iloc[n]과 같이 정수를 입력하면 해당 행을 선택

# 숫자 3은 (위에서 0부터 시작) 4번째 행이라는 뜻.
df.iloc[3]

'''
처리 결과)
date         2010-08-04
temp               25.3
max_wind            6.6
mean_wind           4.2
Name: 2010-08-04, dtype: object
'''
# 특정 행과 열 선택 : 슬라이싱
df.iloc[1:3, 0:2]
# 1~2 행과 0~1열

 

📌  맨 앞의 열은 인덱싱 열이라 해당 x

 

 

 

 


 

5)  불 인덱싱

 

👩🏻‍🚀  하나의 열의 값을 기준으로 데이터를 선택할 수 있음
👩🏻‍🚀  df[df.A > 0]은 df로 부터 A열이 0보다 큰 데이터를 보여줌

 

# 조건에 맞는 데이터를 추출
w = df['temp'] > 30
w

'''
출력 결과)
date
2010-08-01    False
2010-08-02    False
2010-08-03    False
2010-08-04    False
2010-08-05    False
              ...  
2020-07-27    False
2020-07-28    False
2020-07-29    False
2020-07-30    False
2020-07-31    False
Name: temp, Length: 3653, dtype: bool
'''

 

df[w]

출력 결과

 

 

📌  기온이 30도 이상인 데이터만 추출

 

 

 

 


# 최고로 더웠던 날의 모든 정보를 추출
w = df['temp'] == df['temp'].max()
df[w]
# df[df['temp'] == df['temp'].max()]로 써도 된다.


# 조건이 2개 이상인 경우
# 기온이 30도 이상이고, 최대 풍속이 9이상인 데이터
w = (df['temp'] >= 30) & (df['max_wind'] >= 9)
df[w]


 

1.  데이터 파일 저장

DataFrame_data.to_csv(file_name [, options])

 

🚀  to_csv()을 이용하면 DataFrame 형식의 데이터를 텍스트 파일로 저장

🚀  file_name은 텍스트 파일 이름으로 경로를 포함할 수 있음
🚀  선택사항인 options에는 구분자와 문자의 인코딩 방식 등을 지정

       ⚡️ 지정하지 않으면 구분자는 콤마가 되고, 문자의 인코딩 방식은 'utf-8'이 됨

 

# 네 명의 몸무게 Weight와 키 Height 데이터를 DataFrame 형식으로 생성.
df_WH = pd.DataFrame({'Weight': [62, 67, 55, 74],
                      'Height': [165, 177, 160, 180]},
                      index=['ID_1', 'ID_2', 'ID_3', 'ID_4'])
df_WH

df_WH 출력 결과

# index명 지정하는 경우
df_WH.index.name = 'User'
df_WH

df_WH 출력 결과

 


 📌  텍스트 파일 사용 예시

file_name = '../output/save_DataFrame_cp949.txt'
df_pr.to_csv(file_name, sep=' ', encoding='cp949')

 

2. 데이터 확인

1) DataFrame 만들기

import pandas as pd

# csv 파일 불러오기

df = pd.read_csv('../input/weather.csv')
print(df)

출력 결과


 

2) df.shape

 

👾  shape 속성을 이용하면 데이터의 (행, 열) 크기를 확인할 수 있음

df.shape
# 출력 결과 : (3653, 4)

df.shape[0]
# 출력 결과 : 3653

 


 

3) df.info()

 

👾  info()메서드는 데이터에 대한 전반적인 정보를 나타냄
👾  df를 구성하는 행과 열의 크기, 컬럼명, 컬럼을 구성하는 값의 자료형을 출력해 줌

df.info()

'''
출력 결과)
<class 'pandas.core.frame.DataFrame'>
RangeIndex: 3653 entries, 0 to 3652
Data columns (total 4 columns):
 #   Column     Non-Null Count  Dtype  
---  ------     --------------  -----  
 0   date       3653 non-null   object 
 1   temp       3653 non-null   float64
 2   max_wind   3649 non-null   float64
 3   mean_wind  3647 non-null   float64
dtypes: float64(3), object(1)
memory usage: 114.3+ KB
'''

 

  📌  데이터 개수 n=3653 entry, 행 인덱스 번호 0 to 3652
  📌  열 변수 출력 형식 : 실수 float, 문자열 object
  📌  결측치 개수가 나타남 : max_wind, mean_wind 변수에 결측치가 있음 (= 값이 없는 칸이 존재 )

 


 

4) df.head() / df.tail()

 

👾  데이터를 잘 불러 왔는지 확인하기 위해 앞 부분(head)과 마지막 부분(tail)을 확인
👾  head()는 상위 5개 행을 출력하고, tail()은 하위 5개 행을 출력
👾 괄호() 안에 원하는 숫자를 넣으면 그 숫자만큼 행을 출력

# 상위 5행
df.head(5)

출력 결과

# 하위 n행 살펴보기
df.tail()

출력 결과

 


 

5) df.index, df.columns

 

👾  인덱스(행 이름)과 열의 레이블(칼럼 이름)을 출력할 때 사용

# 인덱스 출력
df.index
# 데이터프레임의 인덱스(행 이름)을 반환. 인덱스를 따로 지정하지 않았기 때문에 0부터 시작하는 인덱스가 부여.
# 출력 결과 : RangeIndex(start=0, stop=3653, step=1)
# 컬럼 출력
df.columns
# 출력 결과: Index(['date', 'temp', 'max_wind', 'mean_wind'], dtype='object')

  

 📌  해당 데이터프레임을 구성하는 컬럼명을 확인할 수 있음
 📌  컬럼명을 변경할 때도 유용하게 사용

 


 

6) df.describe()

 

👾  데이터의 컬럼별 요약 통계량을 나타냄
👾  mean(), max() 등 개별 함수를 사용하여 통계량을 계산 할 수 있음

# 요약 통계량 확인하기.
df.describe()

출력 결과


 

7) df.sort_values()

 

👾  데이터를 크기 순으로 정렬

# 형식
DataFrame.sort_values(by=['정렬변수1', '정렬변수2'...], ascending=True, inplace=False


  📌  by=[] : by=을 사용하지 않아도 됨
  📌  ascending=True : True가 기본 값이고 오름차순 정렬. 내림차순 정렬일 경우에는 False 사용.
  📌  inplace=False : True 이면 정렬 결과가 동일 데이터프레임 이름으로 저장. 기본 값은 False.

 

# 최대 풍속 max_wind 컬럼의 값의 크기에 따라 오름차순 정렬
df.sort_values(['max_wind'])

출력 결과

# 최대 풍속 max_wind 컬럼의 값의 크기에 따라 내림차순 정렬
df.sort_values(by=['max_wind'], ascending=False)

출력 결과

 


 

8) df.value_counts()

 

👾  범주형 변수의 빈도분석 결과를 출력, 즉 어떤 컬럼의 unique value(고유값)들의 개수를 구함

bank = pd.read_csv('../input/bank.csv')

# 빈도 분석 출력하기
bank['job'].value_counts()

'''
출력 결과)
job
management       1560
blue-collar      1499
technician       1206
admin.            834
services          661
retired           351
self-employed     256
entrepreneur      239
unemployed        223
housemaid         208
student           153
Name: count, dtype: int64
'''
bank['job'].value_counts(ascending=True)
# -> 위의 결과를 오름차순으로 정렬

 


 

9) df.unique()

 

👾  데이터가 무엇으로 구성되어 있는지 보고 싶을 때 사용. 열의 고유값을 볼 수 있음

# column의 고유값 출력하기
bank['job'].unique()

'''
출력 결과)
array(['management', 'technician', 'blue-collar', 'retired', 'services',
       'admin.', 'entrepreneur', 'self-employed', 'unemployed', 'student',
       nan, 'housemaid'], dtype=object)
'''

 

 

 

 

[ 내용 참고 : IT 학원 강의 ]


 

1. 통계  메서드

sum() 원소의 합
mean()  평균
std() 표준편차
var() 분산
min() 최솟값
max() 최댓값
cumsum() 원소의 누적 합
cumprod() 원소의 누적 곱

 

# 2012년 부터 2016년 까지 우리나라의 계절별 강수량(단위 mm).
table_data3 = {'봄': [256.5, 264.3, 215.9, 223.2, 312.8],
               '여름': [770.6, 567.5, 599.8, 387.1, 446.2],
               '가을': [363.5, 231.2, 293.1, 247.7, 381.6],
               '겨울': [139.3, 59.9, 76.9, 109.1, 108.1]}
columns_list = ['봄', '여름', '가을', '겨울']
index_list = ['2012', '2013', '2014', '2015', '2016']
df3 = pd.DataFrame(table_data3, columns=columns_list, index=index_list)
df3

df3 출력 결과

 

# 2012년에서 2016년에 걸쳐 계절별로 강수량의 평균(mean)과 표준 편차(std)를 구함.
df3.mean()
'''
봄     254.54
여름    554.24
가을    303.42
겨울     98.66
dtype: float64
'''

df3.std()  # 계절별 강수량 표준편차
'''
봄      38.628267
여름    148.888895
가을     67.358496
겨울     30.925523
dtype: float64
'''

 

    📌  연도별로 평균 강수량과 표준 편차를 구할 경우엔 연산의 방향 설정을 위해 axis인자를 추가
    📌  인자 axis가 0이면 DataFrame의 values에서 열별로 연산을 수행하고, 1이면 행별로 연산

    📌  axis 인자를 설정하지 않으면 기본값을 0으로 설정

 

df3.mean(axis=1)
'''
2012    382.475
2013    280.725
2014    296.425
2015    241.775
2016    312.175
dtype: float64
'''

df3.std(axis=1)
'''
2012    274.472128
2013    211.128782
2014    221.150739
2015    114.166760
2016    146.548658
dtype: float64
'''

💡  df.describe()

 

  -  평균, 표준편차, 최솟값과 최댓값 등을 한 번에 구할 수 있는 메서드
  -  25%, 50%, 75% : 백분위수의 각 지점으로, 분포를 반영해 평균을 보완하는 목적으로 사용

df3.describe()

 

출력 결과


 

2.  판다스 데이터  읽기

1) 표 형식 데이터 읽기

🍯  판다스에서 csv파일을 읽을 때는 read_csv() 메서드 이용

🍯  파이썬에서 텍스트파일을 생성하면 기본 문자 인코딩이 ’utf-8’이고, 메모장의 경우 기본 문자 인코딩이 ‘cp949’

DataFrame_data = pd.read_csv(file_name [, options])

 

import pandas as pd

df1 = pd.read_csv('../input/sea_rain1.csv')
df1

 

출력 결과

df1.dtypes
'''
연도      int64
동해    float64
남해    float64
서해    float64
전체    float64
dtype: object
'''

pd.read_csv('../input/sea_rain1_from_notepad.csv')
# UnicodeDecodeError: 'utf-8' codec can't decode byte 0xbf in position 0: 
# invalid start byte

 

    📌  sea_rain1_from_notepad.csv 파일을 메모장으로 생성해서, 인코딩이 'cp949'이므로 에러가 남

            ▶️  메소드 안에 encoding='cp949' 를 붙여주면 된다.

# 올바른 실행 예
pd.read_csv('../input/sea_rain1_from_notepad.csv', encoding='cp949')

 

🍯  txt 파일의 경우 콤마가 아니라 공백(빈칸)으로 구분된 경우 sep 옵션을 이용해서 구분자가 콤마가 아니라 공백임을 지정
🍯  아래 처럼 확장자가 txt라도 read_csv()로 읽을 수 있음.

pd.read_csv('../input/sea_rain1_space.txt', sep=' ')

 

📌  read_csv()로 텍스트 파일을 읽어오면 index가 자동으로 지정
📌  이 때 특정 열 column을 index로 선택하려면

       'index_col=열_이름'을 추가

 

 

pd.read_csv('../input/sea_rain1.csv', index_col='연도')

출력 결과

 

 

 

 

 

[ 내용 참고 :  IT 학원 강의 ]


 

1.  DataFrame을 활용한 데이터 생성

 

🍯  표 Table와 2차원 데이터 처리를 위해 DataFrame을 제공
       ▶️  데이터 Data를 담는 틀 Frame이라는 뜻

 

 

1) 데이터 생성

df = pd.DataFrame(data [, index = index_data, columns = columns_data])


  🐰  data 인자에는 리스트와 형태가 유사한 데이터 타입은 모두 사용 가능
        🥕  리스트, 딕셔너리, numpy의 배열 데이터, Series나 DataFrame 타입의 데이터 입력 가능
  🐰  세로축 라벨을 index라 하고, 가로축 라벨을 columns 라고 함
  🐰  index와 columns를 제외한 부분을 values라고 함

 

import pandas as pd
d1 = pd.DataFrame([[1,2,3], [4,5,6], [7,8,9]])
d1

d1 결과

 

🥕  values 부분에는 입력한 data가 순서대로 입력 돼 있고 가장 좌측의 열과 가장 윗줄의 행에는 각각 숫자가 자동으로 생성되어 index, columns를 구성
  ▶️   명시적으로 입력하지 않더라도 자동으로 index, columns가 생성

 

 


 

📁  numpy의 배열 데이터를 입력해 생성한 DataFrame 데이터의 예

import numpy as np
data_list = np.array([[10,20,30], [40,50,60], [70,80,90]])
print(data_list)
'''
[[10 20 30]
 [40 50 60]
 [70 80 90]]
'''

d2 = pd.DataFrame(data_list)
d2

d2 출력 결과


 

📁 data뿐만 아니라 index와 columns도 지정한 예

data = np.array([[1,2,3], [4,5,6], [7,8,9], [10,11,12]])  # values
index_date = pd.date_range('2019-09-01', periods=4)
columns_list = ['A', 'B', 'C']
d3 = pd.DataFrame(data=data, index=index_date, columns=columns_list)
d3

d3 출력 결과


 

📁  딕셔너리 타입으로 2차원 데이터를 입력한 예

 

      📌  리스트나 넘파이 배열은 행 단위로 입력이 되고, 딕셔너리는 열 단위로 입력됨

table_data = {'연도': [2015, 2016, 2016, 2017, 2017],
              '지사': ['한국', '한국', '미국', '한국', '미국'],
              '고객 수': [200, 250, 450, 300, 500]}
d4 = pd.DataFrame(table_data)

d4 출력 결과

# 입력시 키의 순서를 지정할 수도 있음.
d5 = pd.DataFrame(table_data, columns=['지사', '고객 수', '연도'])
d5

d5 출력 결과


 

📁  DataFrame 데이터에서 index, columns, values을 각각 구한 예

d5.index
# RangeIndex(start=0, stop=5, step=1)

d5.columns
# Index(['지사', '고객 수', '연도'], dtype='object')

d5.values
# 0,한국,200,2015
# 1,한국,250,2016
# 2,미국,450,2016
# 3,한국,300,2017
# 4,미국,500,2017

 


 

2.  데이터 연산

🍯  Pandas의 Series()와 DataFrame()으로 생성된 데이터 끼리는 사칙연산이 가능

🍯  파이썬의 리스트와 numpy의 배열과 달리 pandas의 데이터 끼리는 서로 크기가 달라도 연산이 가능
        ▶️  이 경우 연산을 할 수 있는 항목만 연산을 수행

 

1)  Series()로 생성한 데이터의 예

import pandas as pd

s1 = pd.Series([1,2,3,4,5])
s2 = pd.Series([10,20,30,40,50])
# 덧셈
s1 + s2

'''
0    11
1    22
2    33
3    44
4    55
dtype: int64
'''
# 뺄셈
s2 - s1

'''
0     9
1    18
2    27
3    36
4    45
dtype: int64
'''
# 곱셈
s1 * s2

'''
0     10
1     40
2     90
3    160
4    250
dtype: int64
'''
# 나눗셈
s2 / s1

'''
0    10.0
1    10.0
2    10.0
3    10.0
4    10.0
dtype: float64
'''

 


 

2) 데이터의 크기가 다른 경우

 

🐰   연산할 수 있는 부분만 연산한 결과를 보여주고 연산할 수 없는 부분은 NaN으로 표시

s3 = pd.Series([1,2,3,4])
s4 = pd.Series([10,20,30,40,50])
# 덧셈
s3 + s4

'''
0    11.0
1    22.0
2    33.0
3    44.0
4     NaN
dtype: float64
'''
# 뺄셈
s4 - s3

'''
0     9.0
1    18.0
2    27.0
3    36.0
4     NaN
dtype: float64
'''
# 곱셈
s3 * s4

'''
0     10.0
1     40.0
2     90.0
3    160.0
4      NaN
dtype: float64
'''
# 나눗셈
s4 / s3

'''
0    10.0
1    10.0
2    10.0
3    10.0
4     NaN
dtype: float64
'''

 


3) DataFrame 연산

 

🐰  Series와 마찬가지로 DataFrame도 연산할 수 있는 항목 끼리만 연산하고 그렇지 못한 항목은 NaN으로 표시
        🥕 공간은 차지하되 데이터는 없는 상태

# DataFrame()으로 생성한 데이터의 예
table_data1 = {'A': [1,2,3,4,5],
               'B': [10,20,30,40,50],
               'C': [100,200,300,400,500]}
df1 = pd.DataFrame(table_data1)
df1

table_data2 = {'A': [6,7,8],
               'B': [60,70,80],
               'C': [600,700,800]}
df2 = pd.DataFrame(table_data2)
df2

 

df 1 출력결과
df2 출력 결과

df1 + df2

출력 결과

 

 

 

 

 

[ 내용 참고 : IT 학원 강의 ]


 

1.  Pandas 란

🍯  pandas 라이브러리 : 파이썬에서 데이터 분석과 처리를 쉽게 처리할 수 있게 도와준다
🍯  pandas는 numpy를 기반으로 만들어졌지만 좀 더 복잡한 데이터 분석에 특화
🍯  numpy가 같은 데이터 타입의 배열만 처리할 수 있는데 반해 pandas는 데이터 타입이 다양하게 섞여 있을 때도 처리 가능

 

    📌  공식 홈페이지 : https://pandas.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


2.  구조적 데이터 생성하기

1) Series를 활용한 데이터 생성

🍋  pandas에서 데이터를 생성하는 가장 기본적인 방법은 Series()를 이용하는 것
🍋  Series()를 이용하면 Series 형식의 구조적 데이터(라벨을 갖는 1차원 데이터)를 생성할 수 있음.

 

   📌  다음은 Series()를 이용해 Series 형식의 데이터를 생성하는 방법

s = pd.Series(seq_data)



🍋  Series()의 인자로는 시퀀스 데이터가 들어감
🍋  시퀀스 데이터로는 리스트와 튜플 타입의 데이터를 모두 사용할 수 있지만 주로 리스트 데이터를 이용

import pandas as pd

s1 = pd.Series([10, 20, 30, 40, 50])
print(s1)
s1

 

 

📌  위 쪽의 결과는 print(s1)의 결과

      아래 쪽의 결과는 s1 만 실행했을 때 출력되는 결과 (주피터 노트북 사용 )

 

 

 

 

 

 

 


s1 = pd.Series([10, 20, 30, 40, 50])
s1.index
# 실행 출력
# RangeIndex(start=0, stop=5, step=1)

s1.values

s1.values 결과

 

🍋  numpy의 경우 배열의 모든 원소가 데이터 타입이 같아야 했지만 pandas의 경우에는 원소의 데이터 타입이 달라도 저장 가능

s2 = pd.Series(['a', 'b', 'c', 1, 2, 3])  # 넘파이 였다면 모두 문자열로 변경.
print(s2)
# 0    a
# 1    b
# 2    c
# 3    1
# 4    2
# 5    3
# dtype: object
# 변수 s2에는 문자열과 숫자가 혼합이 되어 있어서 타입이 object

 


3) np.nan

🍋  데이터가 없으면 numpy를 임포트한 후 np.nan으로 데이터가 없음을 표시할 수 있음

import numpy as np
s3 = pd.Series([np.nan, 10, 30])
print(s3)  
'''
출력결과)
0     NaN  -> 데이터를 위한 자리 index는 있지만 실제 값이 없음.
1    10.0
2    30.0
dtype: float64
'''

 

 

4) index

🍋   Series 데이터를 생성할 때 인자로 index 추가 가능

         ▶️  인자로 index를 명시적으로 입력하면 Series 변수(s)의 index에는 자동 생성되는 index 대신 index_seq가 들어가게 됨

         ▶️  index_seq도 리스트와 튜플 타입의 데이터를 모두 사용가능하지만 주로 리스트를 사용

         ▶️ 주의할 점은 seq_data의 항목 개수와 index_seq의 항목 개수가 같아야

s = pd.Series(seq_data, index = index_seq)
# 어느 가게의 날짜별 판매량을 pandas의 Series 형식으로 입력. 하루는 데이터가 없어서 np.nan을 입력
index_data = ['2018-10-07', '2018-10-08', '2018-10-09', '2018-10-10']
s4 = pd.Series([200, 195, np.nan, 205], index=index_data)
s4

s4 실행결과

s4.index
# Index(['2018-10-07', '2018-10-08', '2018-10-09', '2018-10-10'], dtype='object')

 

 

🍋  파이썬의 딕셔너리를 사용하면 데이터와 index를 함께 입력할 수 있음

        ▶️  입력 인자로 딕셔너리 데이터를 입력하면 딕셔너리 데이터의 키 key와 값 value이 각각 Series 데이터의 index와 values로 들어감

s = pd.Series(dict_data)
s5 = pd.Series({'국어': 100, '영어': 95, '수학': 90})
s5
'''
국어,100
영어,95
수학,90
'''

 

3. 날짜 자동 생성 : data_range()

 

🚀  입력해야 할 날짜가 많으면 pandas에서 날짜를 자동생성하는 data_range() 사용
🚀  몇 가지 설정만 하면 원하는 날짜를 자동으로 생성하므로 날짜 데이터를 입력할 때 편리

 

pd.date_range(start=None, end=None, periods=None, freq='D'


    👾  start는 시작날짜, end는 끝날짜
    👾  periods는 날짜 데이터 생성 기간 = 생성 갯수
    👾  freq는 날짜 데이터 생성 주기
    👾  start는 필수이고, end나 periods는 둘 중 하나만 있어도 됨
    👾  freq는 입력하지 않으면 'D' 옵션이 설정돼 달력날짜 기준으로 하루씩 증가

# 시작 날짜와 끝 날짜를 지정해 날짜 데이터를 생성. 하루씩 증가한 날짜 데이터가 생성.
pd.date_range(start='2019-01-01', end='2019-01-07')
'''
DatetimeIndex(['2019-01-01', '2019-01-02', '2019-01-03', '2019-01-04',
               '2019-01-05', '2019-01-06', '2019-01-07'],
              dtype='datetime64[ns]', freq='D')
'''

 


 

1) 날짜 데이터 형식

 

🚀  날짜 데이터를 입력할 때 yyyy-mm-dd  yyyy/mm/dd, yyyy.mm.dd, mm-dd-yyyy, mm/dd/yyyy, mm.dd.yyyy 

      형식 사용가능
        ▶️ 대신 출력은 yyyy-mm-dd 형식으로 생성

pd.date_range(start='2019/01/01', end='2019.01.07')
'''
DatetimeIndex(['2019-01-01', '2019-01-02', '2019-01-03', '2019-01-04',
               '2019-01-05', '2019-01-06', '2019-01-07'],
              dtype='datetime64[ns]', freq='D')
'''

pd.date_range(start='2019-01-01', end='01.07.2019')
'''
DatetimeIndex(['2019-01-01', '2019-01-02', '2019-01-03', '2019-01-04',
               '2019-01-05', '2019-01-06', '2019-01-07'],
              dtype='datetime64[ns]', freq='D')
'''

# 끝 날짜를 지정하지 않고 periods만 입력해서 날짜 생성.
pd.date_range(start='2019-01-01', periods=7)
'''
DatetimeIndex(['2019-01-01', '2019-01-02', '2019-01-03', '2019-01-04',
               '2019-01-05', '2019-01-06', '2019-01-07'],
              dtype='datetime64[ns]', freq='D')
'''

 


 

2)  pandas data_range() 함수의 freq 옵션

약어 설명 사용  예
D 달력 날짜 기준 하루 주기 하루 주기: freq = 'D',  이틀 주기: freq = '2D'
B 업무 날짜 기준 하루 주기 업무일(월~금) 기준으로 생성, freq = 'B',  freq = '3B'
W 일요일 시작 기준 일주일 주기 월요일: W-MON, 화요일: W-TUE, freq = 'W',
freq = 'W-MON'
M 월말 날짜 기준 주기 한 달 주기: freq = 'M', 네 달 주기: freq = '4M'
BM 업무 월말 날짜 기준 주기 freq = 'BM' , freq = '2BM'
MS 월초 날짜 기준 주기 freq = 'MS' , freq = '2MS'
BMS 업무 월초 날짜 기준 주기 freq = 'BMS' , freq = '2BMS'
Q 분기 끝 날짜 기준 주기 freq = 'Q' , freq = '2Q'
BQ 업무 분기 끝 날짜 기준 주기 freq = 'BQ' , freq = '2BQ'
QS 분기 시작 날짜 기준 주기 freq = 'QS' , freq = '2QS'
BQS 업무 분기 시작 날짜 기준 주기 freq = 'BQS' , freq = '2BQS'
A 일년 끝 날짜 기준 주기 freq = 'A' , freq = '2A'
BA 업무 일년 끝 날짜 기준 주기 freq = 'BA' , freq = '2BA'
AS 일년 시작 날짜 기준 주기 freq = 'AS' , freq = '2AS'
BAS 업무 일년 시작 날짜 기준 주기 freq = 'BAS' , freq = '2BAS'
H 시간 기준 주기 1시간 주기: freq = 'H' , 2시간 주기: freq = '2H'
BH 업무 시간 기준 주기 업무 시간(09:00 ~ 17:00) 기준으로 생성
T, min 분 주기 10분 주기: freq = '10T' , 30분 주기: freq = '30min'
S 초 주기 1초 주기: freq = 'S' , 10초 주기: freq = '10S'
# 2일씩 증가하는 날짜를 생성
pd.date_range(start='2019-01-01', periods=4, freq='2D')
# DatetimeIndex(['2019-01-01', '2019-01-03', '2019-01-05', '2019-01-07'], 
# dtype='datetime64[ns]', freq='2D')

 

# 달력의 요일을 기준으로 일주일씩 증가하는 날짜를 생성.
pd.date_range(start='2019-01-06', periods=4, freq='W')
# DatetimeIndex(['2019-01-06', '2019-01-13', '2019-01-20', '2019-01-27'], 
# dtype='datetime64[ns]', freq='W-SUN')
# 업무일 기준 2개월 월말 주기로 12개 날짜를 생성.
pd.date_range(start='2019-01-01', periods=12, freq='2BM')
'''
DatetimeIndex(['2019-01-31', '2019-03-29', '2019-05-31', '2019-07-31',
               '2019-09-30', '2019-11-29', '2020-01-31', '2020-03-31',
               '2020-05-29', '2020-07-31', '2020-09-30', '2020-11-30'],
                dtype='datetime64[ns]', freq='2BM'
'''

 

# 분기 시작일을 기준으로 4개의 날짜를 생성
pd.date_range(start='2019-01-01', periods=4, freq='QS')
# DatetimeIndex(['2019-01-01', '2019-04-01', '2019-07-01', '2019-10-01'], 
# dtype='datetime64[ns]', freq='QS-JAN')

 


 

[ 시간 생성 ]

# 1시간 주기로 10개의 시간을 생성한 예
pd.date_range(start='2019-01-01 08:00', periods=10, freq='H')
'''
DatetimeIndex(['2019-01-01 08:00:00', '2019-01-01 09:00:00',
               '2019-01-01 10:00:00', '2019-01-01 11:00:00',
               '2019-01-01 12:00:00', '2019-01-01 13:00:00',
               '2019-01-01 14:00:00', '2019-01-01 15:00:00',
               '2019-01-01 16:00:00', '2019-01-01 17:00:00'],
              dtype='datetime64[ns]', freq='H')
'''
# 업무 시간을 기준으로 1시간 주기로 10개의 시간을 생성하는 예
# 업무 시간은 9시 부터 17시까지이므로 start시간을 9시 이전으로 설정해도 9시 부터 표시.
pd.date_range(start='2019-01-01 08:00', periods=10, freq='BH')
'''
DatetimeIndex(['2019-01-01 09:00:00', '2019-01-01 10:00:00',
               '2019-01-01 11:00:00', '2019-01-01 12:00:00',
               '2019-01-01 13:00:00', '2019-01-01 14:00:00',
               '2019-01-01 15:00:00', '2019-01-01 16:00:00',
               '2019-01-02 09:00:00', '2019-01-02 10:00:00'],
              dtype='datetime64[ns]', freq='BH')
'''
# date_range()를 이용해 Series의 index를 지정한 예.
index_date = pd.date_range(start='2019-03-01', periods=5, freq='D')
s = pd.Series([51, 62, 55, 49, 58], index=index_date)
s
'''
2019-03-01,51
2019-03-02,62
2019-03-03,55
2019-03-04,49
2019-03-05,58
'''

 

 

 

 

[ 내용 참고: IT 학원 강의 ]

+ Recent posts