
member = {
'Attack': [111, 222, 333],
'Defence': [444, 555, 666],
'Luck': [777, 888, 999]
}
member_df = pd.DataFrame(member)
member_df
| Attack | Defence | Luck | |
|---|---|---|---|
| 0 | 111 | 444 | 777 |
| 1 | 222 | 555 | 888 |
| 2 | 333 | 666 | 999 |
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
| Attack | Defence | Luck | |
|---|---|---|---|
| 0 | 111 | 444 | 777 |
| 1 | 222 | 555 | 888 |
| 2 | 333 | 666 | 999 |
(Index(['Attack', 'Defence', 'Luck'], dtype='object'),
RangeIndex(start=0, stop=3, step=1))
💡 데이터가 제공되면 그것으로 columns 설정
제공되지 않으면 dafault는 RangeIndex(0, 1, 2 .. n)로 설정
# 권장하는 방식
member_df['Attack']
Spencer 111
Tommy 222
Uriel 333
Name: Attack, dtype: int64
member_df.shape
# 행렬 크기를 알 수 있다.
(3, 3)
rich_df = pd.read_csv('TopRichestInWorld (1).csv')
# 단일 열 접근 ->
type(rich_df["Name"])
pandas.core.series.Series
# 미리보기 : 다중 열 접근 -> DataFrame
rich_df[['Name', 'Age']]
| Name | Age | |
|---|---|---|
| 0 | Elon Musk | 50 |
| 1 | Jeff Bezos | 58 |
| 2 | Bernard Arnault & family | 73 |
| 3 | Bill Gates | 66 |
| 4 | Warren Buffett | 91 |
| ... | ... | ... |
| 96 | Vladimir Potanin | 61 |
| 97 | Harold Hamm & family | 76 |
| 98 | Sun Piaoyang | 63 |
| 99 | Luo Liguo & family | 66 |
| 100 | Peter Woo | 75 |
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.size
9
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')]
member_df.sum()
Attack 666
Defence 1665
Luck 2664
dtype: int64
# 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**
# 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 | 누적 최소값 |
• https://www.kaggle.com/datasets/harshitshankhdhar/imdb-dataset-of-top-1000-movies-and-tv-shows/
| 이름 | 설명 |
|---|---|
| Poster_Link | imdb가 사용하는 포스터 링크 |
| Series_Title | 영화 이름 |
| Released_Year | 해당 영화가 개봉된 연도 |
| Certificate | 인증서, 해당 영화로 얻은 인증서 |
| Runtime | 영화의 총 진행길이 |
| Genre | 영화의 장르 |
| IMDB_Rating | IMDB 사이트의 영화 등급 |
| 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
누락값 존재 확인
843 non-null, 899 non-null, 831 non-null로 나온다.집계 함수 요약
movie_df.describe()
🔥 집계함수 요약할 시에 숫자형 데이터만 출력이 된다.
수익인 Gross는 object 형이라 출력이 되지 않는다.
# 1단계 comma(,) 삭제하기
movie_df["Gross"].str.replace(',','')
# movie_df['Gross'].fillna(0, inplace=True)
movie_df["Gross"] = movie_df["Gross"].fillna(0)
movie_df
movie_df["Gross"] = movie_df["Gross"].astype('int64')
movie_df.info()
# 필요하다면 퍼센트 범위를 지정할 수도 있다.
# [20%, 40%, 60%, 80%] -> [.2, .4, .6, .8]
movie_df.describe(percentiles=[.2, .4, .6, .8]).round(1)
| Meta_score | IMDB_Rating | |
|---|---|---|
| count | 843.0 | 1000.0 |
| mean | 78.0 | 7.9 |
| std | 12.4 | 0.3 |
| min | 28.0 | 7.6 |
| 20% | 68.0 | 7.7 |
| 40% | 76.0 | 7.8 |
| 50% | 79.0 | 7.9 |
| 60% | 82.0 | 8.0 |
| 80% | 89.0 | 8.1 |
| max | 100.0 | 9.3 |
# numeric_only=True
movie_df.max(numeric_only=True)
# 만일 50% 지점을 확인한다면 0.5
movie_df.quantile(q=.5, numeric_only=True).round(1)
# 문자열 타입에 대한 요약 정보
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으로 나온다.
movie_df.nlargest(n=5, columns=['IMDB_Rating'])
# 이미 공식 문서에 소개된 내용
movie_df.sort_values(by='IMDB_Rating', ascending=False)
이런 형식으로도 가능
.nsmallest()
# 1차 정렬 IMDB_Rating
movie_df.nsmallest(n=5, columns=['IMDB_Rating'])
# 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()
movie_df.sort_values(by=['IMDB_Rating', 'Meta_score'], ascending=False)
# 영화 제목을 인덱스로 설정하면
movie_df.set_index('Series_Title')
| Series_Title | Released_Year |
|---|---|
| The Shawshank Redemption | 1994 |
| The Godfather | 1972 |
| The Dark Knight | 2008 |
| The Godfather: Part II | 1974 |
| 12 Angry Men | 1957 |
| ... | ... |
| Breakfast at Tiffany's | 1961 |
| Giant | 1956 |
| From Here to Eternity | 1953 |
| Lifeboat | 1944 |
| The 39 Steps | 1935 |
Series_Title이 인덱스로 설정되었음을 볼 수 있다.
.set_index()의 drop=
# 영화 제목을 인덱스로 설정, drop=True라서 Series_Title가 열에서 없어졌다.
movie_df.set_index('Series_Title', drop=True)
# 영화 제목을 인덱스로 설정, drop=False라서 Series_Title이 여전히 열에 있다.
movie_df.set_index('Series_Title', drop=False)
# 열 변경 후 저장 -> 열 이름 변경
movie_df = movie_df.set_index('Series_Title')
movie_df.index.name= 'Title'
# 비파괴적 처리
movie_df.reset_index()
movie_df.reset_index(drop=True)
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')
movie_df = movie_df.drop(columns=['Poster_Link', 'Overview'])
# index label이 1인 것을 삭제
movie_df.drop(labels=1, inplace=True)
# 삭제할 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() 에러 제어
# 이미 삭제한 데이터지만 에러가 발생안함
movie_df.drop(labels=[2,3,4], inplace=True, errors='ignore')
# Runtime을 삭제를 한다고 할 때
del movie_df['Runtime']
# 단일 열 조회를 하면 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_Title | IMDB_Rating | |
|---|---|---|
| 0 | The Shawshank Redemption | 9.3 |
| 1 | The Godfather | 9.2 |
| 2 | The Dark Knight | 9.0 |
| 3 | The Godfather: Part II | 9.0 |
| 4 | 12 Angry Men | 9.0 |
| ... | ... | ... |
| 995 | Breakfast at Tiffany's | 7.6 |
| 996 | Giant | 7.6 |
| 997 | From Here to Eternity | 7.6 |
| 998 | Lifeboat | 7.6 |
| 999 | The 39 Steps | 7.6 |
좀더 안전하게 가져올 땐, .get() 이용
movie_df.get('Series_Title')
movie_df.get(['Series_Title','IMDB_Rating'])
# 마치 dict형에서 값 추가하듯
movie_df['Watched'] = False
False값이 들어가있는 Watched 열이 추가 마지막 열에 추가 된다.
열 추가 - 2. .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)
# 지난 수업 복습겸 작성해보자.
movie_df.drop(columns=['My_score','Watched'], inplace=True)
movie_df.head()
My_Score, Watched를 삭제
# 모든 row x col의 공간. 즉 row의 cell에 NaN이 있으면 1개라도 있으면 row 삭제
movie_df.dropna()
# default : axis=0 -> row를 삭제
# 만일 default : axis=1이면? -> col을 삭제
movie_df.dropna(axis=1)
| A | B | C | D | |
|---|---|---|---|---|
| 0 | 1.0 | NaN | 9.0 | None |
| 1 | 2.0 | NaN | NaN | None |
| 2 | NaN | NaN | NaN | None |
| 3 | 4.0 | 8.0 | NaN | None |
data_df.dropna(how='all', axis=1)
💡 모든 값이 NA인 경우 해당하는 행 또는 열 제거
| A | B | C | |
|---|---|---|---|
| 0 | 1.0 | NaN | 9.0 |
| 1 | 2.0 | NaN | NaN |
| 2 | NaN | NaN | NaN |
| 3 | 4.0 | 8.0 | NaN |
# value=를 이용하여 결측치 대체
data_df.fillna(value=0)
| A | B | C | D | |
|---|---|---|---|---|
| 0 | 1.0 | 0.0 | 9.00 | 0 |
| 1 | 2.0 | 0.0 | 0.0 | 0 |
| 2 | 0.0 | 0.0 | 0.0 | 0 |
| 3 | 4.0 | 8.0 | 0.0 | 0 |
# method='ffill' -> NA를 이전 행 같은 열의 관찰 값으로 대체
data_df.fillna(method='ffill')
| A | B | C | D | |
|---|---|---|---|---|
| 0 | 1.0 | NaN | 9.0 | None |
| 1 | 2.0 | NaN | 9.0 | None |
| 2 | 2.0 | NaN | 9.0 | None |
| 3 | 4.0 | 8.0 | 0.0 | None |
# method='bfill' -> NA를 다음 행 같은 열의 관찰 값으로 대체
data_df.fillna(method='bfill')
| A | B | C | D | |
|---|---|---|---|---|
| 0 | 1.0 | 8.0 | 9.0 | None |
| 1 | 2.0 | 8.0 | NaN | None |
| 2 | 4.0 | 8.0 | NaN | None |
| 3 | 4.0 | 8.0 | NaN | None |
# method='ffill' -> NA를 같은 행 이전 열의 관찰 값으로 대체
data_df.fillna(method='ffill', axis=1)
| A | B | C | D | |
|---|---|---|---|---|
| 0 | 1.0 | 8.0 | 9.0 | 9.0 |
| 1 | 2.0 | 8.0 | NaN | NaN |
| 2 | None | None | None | None |
| 3 | 4.0 | 8.0 | NaN | NaN |
# limit=2로 제한
data_df.fillna(method='ffill', limit=2)
| A | B | C | D | |
|---|---|---|---|---|
| 0 | 1.0 | NaN | 9.0 | None |
| 1 | 2.0 | NaN | 9.0 | None |
| 2 | 2.0 | NaN | 9.0 | None |
| 3 | 4.0 | 8.0 | NaN | None |
# Certificate 열의 NA여부만 확인하고 dropna()를 실행하면
movie_df.dropna(subset='Certificate')