2024.01.03(1) TIL

녹차·2024년 1월 3일

TIL_Python

목록 보기
3/9

01 DataFrame기초-생성(create)

  • DataFrame
    • Series는 1차원 구조
    • DataFrame은 2차원 구조
      • axis = 0 : index 방향 (세로 방향)
      • axis = 1 : columns 방향 (가로 방향)

  • DataFrame 생성
member = {
    'Attack': [111, 222, 333],
    'Defence': [444, 555, 666],
    'Luck': [777, 888, 999]
}
member_df = pd.DataFrame(member)
member_df
AttackDefenceLuck
0111444777
1222555888
2333666999
  • 열접근 (columns)
    • 열 접근을 하면 series가 반환된다.
member_df['Attack']
0    111
1    222
2    333
Name: Attack, dtype: int64
  • 인자 정보 확인
# 리스트로 동일한 데이터 프레임을 만든다면 2
data = [[111, 444, 777], [222, 555, 888], [333, 666, 999]]
columns = ['Attack', 'Defence', 'Luck']

member_df = pd.DataFrame(data, columns=['Attack', 'Defence', 'Luck'])
member_df

# 미리보기
member_df.columns, member_df.index
AttackDefenceLuck
0111444777
1222555888
2333666999
(Index(['Attack', 'Defence', 'Luck'], dtype='object'),
 RangeIndex(start=0, stop=3, step=1))
💡 데이터가 제공되면 그것으로 columns 설정

제공되지 않으면 dafault는 RangeIndex(0, 1, 2 .. n)로 설정

  • index
    • 데이터가 제공되면 그것으로 index 설정
    • 제공되지 않으면 default는 RangeIndex(0, 1, 2...n)로 설정
# 권장하는 방식
member_df['Attack']
Spencer    111
Tommy      222
Uriel      333
Name: Attack, dtype: int64
  • 속성
    • dot을 통해 접근한다.
member_df.shape
# 행렬 크기를 알 수 있다.

(3, 3)

  • csv로 DataFrame 생성
rich_df = pd.read_csv('TopRichestInWorld (1).csv')
# 단일 열 접근 -> 
type(rich_df["Name"])

pandas.core.series.Series

# 미리보기 : 다중 열 접근 -> DataFrame
rich_df[['Name', 'Age']]
NameAge
0Elon Musk50
1Jeff Bezos58
2Bernard Arnault & family73
3Bill Gates66
4Warren Buffett91
.........
96Vladimir Potanin61
97Harold Hamm & family76
98Sun Piaoyang63
99Luo Liguo & family66
100Peter Woo75

02 DataFrame기초-속성(Attrs)

member_df.info()
<class 'pandas.core.frame.DataFrame'>
RangeIndex: 3 entries, 0 to 2
Data columns (total 3 columns):
 #   Column   Non-Null Count  Dtype
---  ------   --------------  -----
 0   Attack   3 non-null      int64
 1   Defence  3 non-null      int64
 2   Luck     3 non-null      int64
dtypes: int64(3)
memory usage: 204.0 bytes
  • member_df의 column들이나 null값들 데이터의 형식을 알 수 있도록 해준다.
member_df.size

9

  • .shape는 구조, .size는 크기
member_df.values
array([[111, 444, 777],
       [222, 555, 888],
       [333, 666, 999]], dtype=int64)
  • 어떠한 변수들이 있는지 알 수 있다.
member_df.dtypes
Attack     int64
Defence    int64
Luck       int64
dtype: object
  • 각 컬럼의 데이터 형을 알 수 있다.
member_df.axes
[RangeIndex(start=0, stop=3, step=1),
 Index(['Attack', 'Defence', 'Luck'], dtype='object')]
  • 인덱스 정보와 열 정보를 알 수 있다.

03 DataFrame기초-메소드(Methods)

member_df.sum()
Attack      666
Defence    1665
Luck       2664
dtype: int64
  • .sum()은 각 열 => 각 Series를 .sum() 한 결과로 또 다른 Series를 만든다.
    • Series는 .sum()하면 단일 값
    • DataFrame을 .sum()하면 Series
# axis = 0, axis = 'index'
member_df.sum(axis=0) #세로방향
member_df.sum(axis='index') #세로방향
Attack      666
Defence    1665
Luck       2664
dtype: int64
# axis = 1, axis = 'columns'
member_df.sum(axis=1) # 가로방향
member_df.sum(axis='columns') # 가로방향
0    1332
1    1665
2    1998
dtype: int64
  • axis = 0 은 index 방향 (세로)
  • axis = 1은 columns 방향 (가로)

**집계함수 + axis**

  • axis를 사용하여 행과 열별로 집계함수 가능
# max, axis = 0
member_df.max(axis=0)

# min, axis = 'columns'
member_df.min(axis=0)

# mean, axis = 'index'
member_df.mean()

# median, axis = 1
member_df.median() #중간값

# prod, axis = 1, prod는 곱셈 연산
member_df.prod() # 세로로 전부 곱셈
  • 다 아는 집계 함수 들이다. 정리하자면
메소드설명
min최소값
max최대값
sum합계
mean평균
median중앙값
count비결측치의 개수
value_counts각 값의 빈도
describe요약 통계량
mode최빈값
std표준편차
var분산
prod모든 요소의 곱
quantile분위수
cumsum누적 합
cumprod누적 곱
cummax누적 최대값
cummin누적 최소값
🔥 이정도가 있다! 엄청 많다.

04 DataFrame기초-정보와요약(info, describe)

  • 영화 데이터셋

https://www.kaggle.com/datasets/harshitshankhdhar/imdb-dataset-of-top-1000-movies-and-tv-shows/

이름설명
Poster_Linkimdb가 사용하는 포스터 링크
Series_Title영화 이름
Released_Year해당 영화가 개봉된 연도
Certificate인증서, 해당 영화로 얻은 인증서
Runtime영화의 총 진행길이
Genre영화의 장르
IMDB_RatingIMDB 사이트의 영화 등급
Overview개요. 미니스토리/요약
Meta_score영화에서 얻은 점수
Director영화 감독 이름
Star1,Star2,Star3,Star4대표 배우 이름
No_of_votes총 투표 수
Gross해당 영화로 수익(돈
movie_df = pd.read_csv('imdb_top_1000.csv')
  • 필요한 열만 가져오기
cols = ['Series_Title', 'Released_Year', 'Certificate', 'Genre', 'IMDB_Rating', 'Meta_score', 'Director', 'No_of_Votes', 'Gross']

# 가져올 열 지정하기
movie_df = pd.read_csv('imdb_top_1000.csv', usecols=cols)
movie_df = movie_df[cols]
  • usecols를 사용하여 열을 지정할 수 있다.

  • 간략한 요약 출력

movie_df.info()
 #   Column         Non-Null Count  Dtype
---  ------         --------------  -----
 0   Released_Year  1000 non-null   object
 1   Genre          1000 non-null   object
 2   Series_Title   1000 non-null   object
 3   Director       1000 non-null   object
 4   Meta_score     **843 non-null**    float64
 5   IMDB_Rating    1000 non-null   float64
 6   No_of_Votes    1000 non-null   int64
 7   Certificate    **899 non-null**    object
 8   Gross          **831 non-null**    object
dtypes: float64(2), int64(1), object(6)
memory usage: 70.4+ KB
  • 누락값 존재 확인

    • 누락값이 Meta_score와 Certificate, Gross 열에서 보인다.
    • 총 1000개의 데이터가 있어야하는데, 843 non-null899 non-null831 non-null로 나온다.
  • 집계 함수 요약

movie_df.describe()
🔥 집계함수 요약할 시에 숫자형 데이터만 출력이 된다. 수익인 Gross는 object 형이라 출력이 되지 않는다.
  • 수익(Gross)을 숫자형으로 바뀌기
  1. 포맷 변경하기
    1. 숫자형 데이터로 변환 가능한 형태로 처리
    2. comma(,)부터 .str.replace() 로 삭제
# 1단계 comma(,) 삭제하기
movie_df["Gross"].str.replace(',','')
  • replace를 사용하여 comma를 없애기
  1. 결측치 대체하기
    1. NaNd으로 나오고 있는 결측치를 0으로 대체
# movie_df['Gross'].fillna(0, inplace=True)
movie_df["Gross"] = movie_df["Gross"].fillna(0)
movie_df
  1. dtype 변환하기
    1. 정수형 dtype을 int64로 변환
movie_df["Gross"] = movie_df["Gross"].astype('int64')
movie_df.info()
  • 백분위수
    • 각 00% 백분위수를 확인할 수 있음
# 필요하다면 퍼센트 범위를 지정할 수도 있다.
# [20%, 40%, 60%, 80%] -> [.2, .4, .6, .8]
movie_df.describe(percentiles=[.2, .4, .6, .8]).round(1)
Meta_scoreIMDB_Rating
count843.01000.0
mean78.07.9
std12.40.3
min28.07.6
20%68.07.7
40%76.07.8
50%79.07.9
60%82.08.0
80%89.08.1
max100.09.3
  • numeric_only=
    • max, min, mean 등을 DataFrame에서 바로 사용하면 때때로 경고(Warning)이 발생한다.
    • 숫자형 데이터만 있는 건 아니기 때문임으로 숫자만 처리하도록 지정하는 것.
# numeric_only=True
movie_df.max(numeric_only=True)
  • .quantile()
    • 분위수 : 오름차순/내림차순 되어 있을 때 이를 나누는 지점
    • percentiles : 백분위수, 100개 영역 지점이 존재. 퍼센트
    • quartiles : 4분위수, 4구역 지점이 존재
# 만일 50% 지점을 확인한다면 0.5
movie_df.quantile(q=.5, numeric_only=True).round(1)
  • include=
    1. 'all': 입력된 모든 열이 결과에 포함됩니다.
    2. 데이터 유형의 목록 형태(list-like of dtypes): 결과를 지정된 데이터 유형으로 제한합니다.
      • 숫자 유형에 대한 결과를 제한하려면 numpy.number를 사용하고,
      • 객체 열에 대한 결과를 제한하려면 numpy.object 데이터 유형을 사용합니다.
      • select_dtypes와 유사한 방식으로 문자열도 사용할 수 있습니다 (예: df.describe(include=['O'])). 알파벳임. 0아님
      • pandas 범주형 열을 선택하려면 'category'를 사용합니다.
    3. None (기본값): 결과에는 모든 숫자 열이 포함됩니다.
# 문자열 타입에 대한 요약 정보
movie_df.describe(include =['object'])
# 숫자형 타입에 대한 요약 정보
movie_df.describe(include =['int64'])
movie_df.describe(include =['float64'])
movie_df.describe(include =['number'])
# 모든(all) 타입에 대한 요약 정보
movie_df.describe(include = 'all').round(1)

표현할 수 없는 항목은 NaN으로 나온다.

  • 문자열 데이터는 mean, std, min등을 표현할 수 없고
  • 숫자형 데이터는 unique, top, freq를 표현할 수 있을 것 같은데, 크게 의미가 없습니다.
    • unique: 숫자형 데이터는 고유한(unique) 값의 개수를 가질 수 없으므로 NaN으로 처리
    • top: 숫자형 데이터는 가장 빈도가 높은(top) 값이라는 개념이 적용되지 않으므로 NaN으로 처리
    • freq: 숫자형 데이터는 각 값의 빈도수를 측정할 수 없으므로 NaN으로 처리

05 DataFrame기초-정렬(nlargest,nsmallest,sort_values)

  • .nlargest()
    • 중복된 값이 있을 경우 우선순위
      • first : 첫번째 발생의 우선순위 지정
      • last : 마지막 발생의 우선순위 지정
      • all : n개 이상의 항목을 선택하는 것을 의미하더라도 중복 항목을 삭제하지 않는다
movie_df.nlargest(n=5, columns=['IMDB_Rating'])
  • IMDB_Rating가 큰 상위 5개 순서대로 데이터프레임을 출력한다.
# 이미 공식 문서에 소개된 내용
movie_df.sort_values(by='IMDB_Rating', ascending=False)
  • 이런 형식으로도 가능

  • .nsmallest()

# 1차 정렬 IMDB_Rating
movie_df.nsmallest(n=5, columns=['IMDB_Rating'])
  • IMDB_Rating가 작은 상위 5개 순서대로 데이터프레임을 출력한다.
# 1차 정렬 IMDB_Rating, 2차 정렬 Meta_score
movie_df.nsmallest(n=5, columns=['IMDB_Rating', 'Meta_score'])
  • 2개의 column을 사용하여 2차정렬까지 가능

  • keep=

# IMDB_Rating 최고 7개, 동점의 경우 끝에있는 것부터 우선배치
movie_df.nlargest(n=7, columns='IMDB_Rating', keep='last')
  • 중복된 값이 있는 경우 끝에 있는 것부터 우선 배치
# IMDB_Rating 최고 7개, 동점의 경우 8개가 넘더라도 추가
movie_df.nlargest(n=7, columns='IMDB_Rating', keep='all')
  • 중복된 값이 있는 경우 n=7이더라도 추가로 배치

  • .sort_values()

    • 축이 0이거나 'index'일 경우 인덱스 수준 및/또는 열 레이블을 포함할 수 있습니다.
    • 축이 1이거나 'columns'인 경우 열 수준 및/또는 인덱스 레이블을 포함할 수 있습니다.
movie_df.sort_values(by=['IMDB_Rating', 'Meta_score'], ascending=False)

06 DataFrame기초-인덱스제어(set_index,reset_index,index_col)

  • .set_index()
    • 특정 열을 인덱스로 설정하는 기능을 제공
# 영화 제목을 인덱스로 설정하면
movie_df.set_index('Series_Title')
Series_TitleReleased_Year
The Shawshank Redemption1994
The Godfather1972
The Dark Knight2008
The Godfather: Part II1974
12 Angry Men1957
......
Breakfast at Tiffany's1961
Giant1956
From Here to Eternity1953
Lifeboat1944
The 39 Steps1935
  • Series_Title이 인덱스로 설정되었음을 볼 수 있다.

  • .set_index()의 drop=

    • .set_index()로 index열을 변경할 때, 인덱스로 지정된 열을 기존 열에서 삭제할 지 여부를 정한다.
    • default가 True라서 삭제된다.
# 영화 제목을 인덱스로 설정, drop=True라서 Series_Title가 열에서 없어졌다.
movie_df.set_index('Series_Title', drop=True)
# 영화 제목을 인덱스로 설정, drop=False라서 Series_Title이 여전히 열에 있다.
movie_df.set_index('Series_Title', drop=False)
  • df.index.name=
    • Series_Title이란 이름이 어색한 것 같아서 Title로 변경해보자
# 열 변경 후 저장 -> 열 이름 변경
movie_df = movie_df.set_index('Series_Title')
movie_df.index.name= 'Title'
  • .reset_index()
    • 인덱스를 초기화
# 비파괴적 처리
movie_df.reset_index()
  • .reset_index()의 drop=
    • 기존 인덱스를 데이터 열로 삽입되지 않고 삭제
    • 인덱스는 기본 정수형 인덱스로 설정
movie_df.reset_index(drop=True)
  • index_col = : 읽어올 때 index열 설정하기
cols = ['Released_Year', 'Genre', 'Series_Title', 'Director', 'Meta_score', 'IMDB_Rating', 'No_of_Votes', 'Certificate', 'Gross']

# 가져올 열과 인덱스 열을 지정하기
movie_df = pd.read_csv('imdb_top_1000.csv', usecols=cols, index_col='Series_Title')

07 DataFrame기초-행렬삭제(drop)

  • .drop() - 1. 열 삭제(columns=)
    • 불필요해보이는 Poster_link와 Overview를 삭제하는 작업 수행
movie_df = movie_df.drop(columns=['Poster_Link', 'Overview'])
  • .drop() - 2. 행 삭제(by label)
# index label이 1인 것을 삭제
movie_df.drop(labels=1, inplace=True)
  • .drop() - 3. 행 삭제(by labels, list-like)
# 삭제할 index label을 리스트로 전달
# movie_df.drop(labels=[2, 3, 4], inplace=True)
movie_df.drop(labels=[2,3,4], inplace=True)
  • label이 2, 3, 4인 것들 삭제

  • .drop() - 4. 열 삭제(axis=1 필요)

movie_df.drop(['Star1','Star2','Star3','Star4'], axis=1, inplace=True)
movie_df
  • Star1, Star2, Star3, Star4 열 삭제

  • errors= : .drop() 에러 제어

    • ‘ignore'인 경우 기존 오류를 무시하고 레이블만 삭제
# 이미 삭제한 데이터지만 에러가 발생안함
movie_df.drop(labels=[2,3,4], inplace=True, errors='ignore')
  • del을 이용한 열 삭제
# Runtime을 삭제를 한다고 할 때
del movie_df['Runtime']

08 DataFrame기초-열조회와추가(get, insert)

  • 열 조회
# 단일 열 조회를 하면 Series가 return된다.
movie_df['Series_Title']
0      The Shawshank Redemption
1                 The Godfather
2               The Dark Knight
3        The Godfather: Part II
4                  12 Angry Men
                 ...
995      Breakfast at Tiffany's
996                       Giant
997       From Here to Eternity
998                    Lifeboat
999                The 39 Steps
Name: Series_Title, Length: 1000, dtype: object
# 다중 열 조회를 하면 DataFrame
movie_df[['Series_Title','IMDB_Rating']]
Series_TitleIMDB_Rating
0The Shawshank Redemption9.3
1The Godfather9.2
2The Dark Knight9.0
3The Godfather: Part II9.0
412 Angry Men9.0
.........
995Breakfast at Tiffany's7.6
996Giant7.6
997From Here to Eternity7.6
998Lifeboat7.6
999The 39 Steps7.6
🚫 없는 열을 조회하면 Error 발생

좀더 안전하게 가져올 땐, .get() 이용

movie_df.get('Series_Title')

movie_df.get(['Series_Title','IMDB_Rating'])
  • 열 추가 - 1. 일련화 된 값
    • 내가 본 영화를 체크하는 란 생성
    • 리스트의 .append()처럼 위치는 지정할 수 없다. (뒤에 붙음)
# 마치 dict형에서 값 추가하듯
movie_df['Watched'] = False
  • False값이 들어가있는 Watched 열이 추가 마지막 열에 추가 된다.

  • 열 추가 - 2. .insert()를 이용한 일련화된 값

    • 나만의 평점을 추가해본다고 하자
    • .insert()를 이용하면 위치도 지정할 수 있다.

loc : int 삽입 인덱스. 0 <= loc <= len(columns)을 확인해야 합니다.

column : str, number 또는 hashable object 삽입된 column의 Label.

value : 스칼라, 직렬 또는 배열과 같은

allow_ duplicates : bool, 옵션, 기본값 lib.no _default

# Watched 앞에 넣어보자 ->  추가된 후 최종 위치 -> 0 1 2 3 4 [5] 6위치
movie_df.insert(loc=5, column='My_score', value=None)
  • 열 추가 - 3. 다양한 값 추가(Series or array-like)
    • value인자 설명을 보면 Series or array-like
    • Series와 array-like가 개수만 맞다면 추가 가능
# 지난 수업 복습겸 작성해보자.
movie_df.drop(columns=['My_score','Watched'], inplace=True)
movie_df.head()

My_ScoreWatched를 삭제

09 DataFrame기초-결측치제어(dropna,fillna)

  • .dropna()
    • NaN 유형 데이터를 drop(삭제)시킨다.
# 모든 row x col의 공간. 즉 row의 cell에 NaN이 있으면 1개라도 있으면 row 삭제
movie_df.dropna()
# default : axis=0 -> row를 삭제
# 만일 default : axis=1이면? -> col을 삭제
movie_df.dropna(axis=1)
  • how= : NA발견시 제거되는 방식 설정
    • how : {'any', 'all'}, default 'any'
    • NA 발견시 행 또는 열이 데이터프레임에서 제거되는 방식을 결정
    • 'any' : 만약 NA 값이 하나라도 존재한다면, 해당 행 또는 열을 제거, default
    • 'all' : 만약 모든 값이 NA인 경우에 해당하는 행 또는 열을 제거
ABCD
01.0NaN9.0None
12.0NaNNaNNone
2NaNNaNNaNNone
34.08.0NaNNone
data_df.dropna(how='all', axis=1)
💡 모든 값이 NA인 경우 해당하는 행 또는 열 제거
ABC
01.0NaN9.0
12.0NaNNaN
2NaNNaNNaN
34.08.0NaN
  • .fillna() : 결측치 대체하기
# value=를 이용하여 결측치 대체
data_df.fillna(value=0)
ABCD
01.00.09.000
12.00.00.00
20.00.00.00
34.08.00.00
  • method='ffill'
# method='ffill' -> NA를 이전 행 같은 열의 관찰 값으로 대체
data_df.fillna(method='ffill')
ABCD
01.0NaN9.0None
12.0NaN9.0None
22.0NaN9.0None
34.08.00.0None
  • method=’bfill'
# method='bfill' -> NA를 다음 행 같은 열의 관찰 값으로 대체
data_df.fillna(method='bfill')
ABCD
01.08.09.0None
12.08.0NaNNone
24.08.0NaNNone
34.08.0NaNNone
  • method='ffill', axis=1
# method='ffill' -> NA를 같은 행 이전 열의 관찰 값으로 대체
data_df.fillna(method='ffill', axis=1)
ABCD
01.08.09.09.0
12.08.0NaNNaN
2NoneNoneNoneNone
34.08.0NaNNaN
  • limit=
    • 연속되어 결측치를 나올 경우, 결측치 대체 횟수 지정
# limit=2로 제한
data_df.fillna(method='ffill', limit=2)
ABCD
01.0NaN9.0None
12.0NaN9.0None
22.0NaN9.0None
34.08.0NaNNone
  • subset= : 특정열의 NA만 확인
    • 고려해야 할 다른 축을 따라 레이블을 지정합니다. 예를 들어 행을 드롭하는 경우 이러한 레이블은 포함할 열 목록이 됩니다.
# Certificate 열의 NA여부만 확인하고 dropna()를 실행하면
movie_df.dropna(subset='Certificate')
  1. Certificate가 NaN인 경우 row가 삭제되고,
  2. Gross의 NaN은 제거 연산에서 제외되었다.
profile
가장 예쁜 꽃은 우여곡절 끝에 피는 꽃

0개의 댓글