08wk-1: Pandas (1)

Author

최규빈

Published

April 24, 2023

강의영상

youtube: https://youtube.com/playlist?list=PLQqh36zP38-xqAT5XH-YhYj1s2WQWhKE8

import

import numpy as np
import pandas as pd

pandas 개발동기

부분 데이터 꺼내기: 판다스를 왜 써야할까?

- 예시1: 때로는 인덱스로 때로는 key로 데이터를 부르고 싶다.

np.random.seed(43052)
att = np.random.choice(np.arange(10,21)*5,20)
rep = np.random.choice(np.arange(5,21)*5,20)
mid = np.random.choice(np.arange(0,21)*5,20)
fin = np.random.choice(np.arange(0,21)*5,20)
key = ['2022-12'+str(s) for s in np.random.choice(np.arange(300,501),20,replace=False)]

학번 ’2022-12363’에 해당하는 학생의 출석점수를 알고 싶다면?

(풀이1) – dct로 자료를 저장하고 출력

dct = {'att':{key[i]:att[i] for i in range(20)}, 
       'rep':{key[i]:rep[i] for i in range(20)}, 
       'mid':{key[i]:mid[i] for i in range(20)}, 
       'fin':{key[i]:fin[i] for i in range(20)}}
#dct
dct['att']['2022-12363']
65

(풀이2) – ndarray로 자료를 저장하고 출력

arr = np.array([att,rep,mid,fin,key]).T
arr
array([['65', '55', '50', '40', '2022-12380'],
       ['95', '100', '50', '80', '2022-12370'],
       ['65', '90', '60', '30', '2022-12363'],
       ['55', '80', '75', '80', '2022-12488'],
       ['80', '30', '30', '100', '2022-12312'],
       ['75', '40', '100', '15', '2022-12377'],
       ['65', '45', '45', '90', '2022-12463'],
       ['60', '60', '25', '0', '2022-12471'],
       ['95', '65', '20', '10', '2022-12400'],
       ['90', '80', '80', '20', '2022-12469'],
       ['55', '75', '35', '25', '2022-12318'],
       ['95', '95', '45', '0', '2022-12432'],
       ['95', '55', '15', '35', '2022-12443'],
       ['50', '80', '40', '30', '2022-12367'],
       ['50', '55', '15', '85', '2022-12458'],
       ['95', '30', '30', '95', '2022-12396'],
       ['50', '50', '45', '10', '2022-12482'],
       ['65', '55', '15', '45', '2022-12452'],
       ['70', '70', '40', '35', '2022-12387'],
       ['90', '90', '80', '90', '2022-12354']], dtype='<U21')
arr[arr[:,-1] == '2022-12363',0] # 읽기어려운 코드
array(['65'], dtype='<U21')

(풀이2)가 (풀이1)에 비하여 불편한 점

  • arr 마지마칼럼이 student id 이고 첫번째 칼럼은 att라는 사실을 암기하고 있어야 한다.
  • 자료형이 문자로 강제로 바뀌어서 저장되어있음
  • 작성한 코드의 가독성이 없다. (위치로 접근하기 때문)

- 요약: hash 스타일로 정보를 추출하는 것이 유용할 때가 있다. 그리고 보통 hash 스타일로 정보를 뽑는 것이 유리하다. (사실 numpy는 정보추출을 위해 개발된 자료형이 아니라 행렬 및 벡터의 수학연산을 지원하기 위해 개발된 자료형이다)

- 소망: 정보를 추출할때는 hash 스타일도 유용하다는 것은 이해함 \(\to\) 하지만 나는 가끔 넘파이스타일로 정보를 뽑고 싶은걸? 그리고 딕셔너리 형태가 아니고 엑셀처럼(행렬처럼) 데이터를 보고 싶은걸? \(\to\) pandas의 개발

엑셀처럼 데이터를 테이블 형태로 정리하고 싶다

(방법1) – 넘파이

arr
array([['65', '55', '50', '40', '2022-12380'],
       ['95', '100', '50', '80', '2022-12370'],
       ['65', '90', '60', '30', '2022-12363'],
       ['55', '80', '75', '80', '2022-12488'],
       ['80', '30', '30', '100', '2022-12312'],
       ['75', '40', '100', '15', '2022-12377'],
       ['65', '45', '45', '90', '2022-12463'],
       ['60', '60', '25', '0', '2022-12471'],
       ['95', '65', '20', '10', '2022-12400'],
       ['90', '80', '80', '20', '2022-12469'],
       ['55', '75', '35', '25', '2022-12318'],
       ['95', '95', '45', '0', '2022-12432'],
       ['95', '55', '15', '35', '2022-12443'],
       ['50', '80', '40', '30', '2022-12367'],
       ['50', '55', '15', '85', '2022-12458'],
       ['95', '30', '30', '95', '2022-12396'],
       ['50', '50', '45', '10', '2022-12482'],
       ['65', '55', '15', '45', '2022-12452'],
       ['70', '70', '40', '35', '2022-12387'],
       ['90', '90', '80', '90', '2022-12354']], dtype='<U21')

(방법2) – 판다스 with stacked dict

df = pd.DataFrame(dct)
df.head()
att rep mid fin
2022-12380 65 55 50 40
2022-12370 95 100 50 80
2022-12363 65 90 60 30
2022-12488 55 80 75 80
2022-12312 80 30 30 100

(방법3) – 판다스 with index

df = pd.DataFrame({'att':att,'rep':rep,'mid':mid,'fin':fin},index=key)
df.head()
att rep mid fin
2022-12380 65 55 50 40
2022-12370 95 100 50 80
2022-12363 65 90 60 30
2022-12488 55 80 75 80
2022-12312 80 30 30 100

해싱으로 원하는 정보를 뽑으면 좋겠다 (마치 딕셔너리처럼)

- 예제1: 출석점수를 출력 (딕셔너리가 되면 판다스도 된다)

# dct['att']
df['att']
2022-12380    65
2022-12370    95
2022-12363    65
2022-12488    55
2022-12312    80
2022-12377    75
2022-12463    65
2022-12471    60
2022-12400    95
2022-12469    90
2022-12318    55
2022-12432    95
2022-12443    95
2022-12367    50
2022-12458    50
2022-12396    95
2022-12482    50
2022-12452    65
2022-12387    70
2022-12354    90
Name: att, dtype: int64

- 예제2: 학번 2022-12380 의 출석점수 출력

#dct['att']['2022-12380']
df['att']['2022-12380']
65

인덱싱으로 정보를 뽑는 기능도 지원을 하면 좋겠다 (마치 리스트나 넘파이처럼)

- 예제1: 첫번째 학생의 기말고사 성적을 출력하고 싶다.

df.iloc[0,-1]
40
  • 벼락치기: df에서 iloc이라는 특수기능을 이용하면 넘파이 인덱싱처럼 원소출력이 가능하다.

df는 딕셔너리 같은것이지만 df.iloc은 넘파이같은것이라고 생각하면 된다.

- 예제2: 홀수번째 학생 의 점수를 뽑고 싶다. (홀수번째 학생은 인덱스 0,2,4,… 에 대응)

df.iloc[::2,:]
att rep mid fin
2022-12380 65 55 50 40
2022-12363 65 90 60 30
2022-12312 80 30 30 100
2022-12463 65 45 45 90
2022-12400 95 65 20 10
2022-12318 55 75 35 25
2022-12443 95 55 15 35
2022-12458 50 55 15 85
2022-12482 50 50 45 10
2022-12387 70 70 40 35

- 예제3: 맨 끝에서 3명의 점수를 출력하고 싶다.

df.iloc[-3:,:]
att rep mid fin
2022-12452 65 55 15 45
2022-12387 70 70 40 35
2022-12354 90 90 80 90

- 예제4: 맨 끝에서 3명의 점수중 마지막 2개의 칼럼만 출력하고 싶다.

df.iloc[-3:,-2:]
mid fin
2022-12452 15 45
2022-12387 40 35
2022-12354 80 90

궁극: 해싱과 인덱싱을 모두 지원하는 아주 우수한 자료형을 만들고 싶음

- 예제1: ’mid >= 20 and att <60’인 학생들의 ’fin’을 출력

(방법1) query

  • 데이터베이스 스타일
df.query('mid>=20 and att<60')['fin']
2022-12488    80
2022-12318    25
2022-12367    30
2022-12482    10
Name: fin, dtype: int64

(방법2) numpy

arr[(arr[:,2].astype(dtype=np.int64) >= 20) & (arr[:,0].astype(dtype=np.int64) < 60),3]
array(['80', '25', '30', '10'], dtype='<U21')

- 예제2: ’중간고사점수<기말고사점수’인 학생들의 출석점수 평균을 구하자.

df.query('mid<fin')['att'].mean()
76.66666666666667

pandas 공부 1단계

데이터프레임 선언

- 방법1: dictionary에서 만든다.

pd.DataFrame({'att':[30,40,50],'mid':[50,60,70]})
att mid
0 30 50
1 40 60
2 50 70
pd.DataFrame({'att':(30,40,50),'mid':(50,60,70)})
att mid
0 30 50
1 40 60
2 50 70
pd.DataFrame({'att':np.array([30,40,50]),'mid':np.array([50,60,70])})
att mid
0 30 50
1 40 60
2 50 70

- 방법: 2차원 ndarray에서 만든다.

np.arange(2*3).reshape(2,3)
array([[0, 1, 2],
       [3, 4, 5]])
pd.DataFrame(np.arange(2*3).reshape(2,3))
0 1 2
0 0 1 2
1 3 4 5

열의 이름 부여

- 방법1: 딕셔너리를 통하여 만들면 딕셔너리의 key가 자동으로 열의 이름이 된다.

pd.DataFrame({'att':np.array([30,40,50]),'mid':np.array([50,60,70])})
att mid
0 30 50
1 40 60
2 50 70

- 방법2: pd.DataFrame()의 옵션에 columns를 이용

pd.DataFrame(np.arange(2*3).reshape(2,3),columns=['X1','X2','X3'])
X1 X2 X3
0 0 1 2
1 3 4 5

- 방법3: df.columns에 원하는 열이름을 덮어씀 (1)

df=pd.DataFrame(np.arange(2*3).reshape(2,3))
df
0 1 2
0 0 1 2
1 3 4 5
df.columns = ['X1','X2','X3']
df
X1 X2 X3
0 0 1 2
1 3 4 5

- 방법4: df.columns에 원하는 열이름을 덮어씀 (2)

df=pd.DataFrame(np.arange(2*3).reshape(2,3))
df
0 1 2
0 0 1 2
1 3 4 5
df.columns = pd.Index(['X1','X2','X3'])
df
X1 X2 X3
0 0 1 2
1 3 4 5

방법4가 방법3의 방식보다 컴퓨터가 이해하기 좋다. (= 불필요한 에러 혹은 경고메시지를 방지할 수 있다)

행의 이름 부여

- 방법1: 중첩 dict이면 nested dic의 key가 알아서 행의 이름으로 된다.

pd.DataFrame({'att':{'guebin':30, 'iu':40, 'hynn':50} , 'mid':{'guebin':5, 'iu':45, 'hynn':90}})
att mid
guebin 30 5
iu 40 45
hynn 50 90

- 방법2: pd.DataFrame()의 index 옵션 이용

pd.DataFrame({'att':[30,40,50] , 'mid':[5,45,90]},index=['guebin','iu','hynn'])
att mid
guebin 30 5
iu 40 45
hynn 50 90

- 방법3: df.index에 덮어씌움

df=pd.DataFrame({'att':[30,40,50] , 'mid':[5,45,90]})
df
att mid
0 30 5
1 40 45
2 50 90
df.index = pd.Index(['guebin','iu','hynn'])
#df.index = ['guebin','iu','hynn'] <- 이것도 실행가능하기는함 
df
att mid
guebin 30 5
iu 40 45
hynn 50 90

- 방법4: df.set_index() 를 이용하여 덮어씌운다

df=pd.DataFrame({'att':[30,40,50] , 'mid':[5,45,90]})
df
att mid
0 30 5
1 40 45
2 50 90
df.set_index(pd.Index(['guebin','iu','hynn']))
att mid
guebin 30 5
iu 40 45
hynn 50 90
df.set_index(['guebin','iu','hynn'])
KeyError: "None of ['guebin', 'iu', 'hynn'] are in the columns"
df.set_index([['guebin','iu','hynn']]) # 꺽쇠를 한번 더 넣어주면 에러를 피할수 있다. 
att mid
guebin 30 5
iu 40 45
hynn 50 90
  • 그러나 이런 코드를 권장하지 않음

자료형, len, shape, for문의 반복변수

df = pd.DataFrame({'att':[30,40,50],'mid':[5,45,90]})
df
att mid
0 30 5
1 40 45
2 50 90

- type

type(df)
pandas.core.frame.DataFrame

- len

len(df) # row의 갯수 
3

- shape

df.shape 
(3, 2)

- for문의 반복변수

for k in df:
    print(k) # 딕셔너리같죠
att
mid
for k in {'att':[30,40,50],'mid':[5,45,90]}: 
    print(k)
att
mid

참고: df는 진짜 딕셔너리 느낌 강해요

df.keys()
Index(['att', 'mid'], dtype='object')
for k,v in df.items():
    print(k)
att
mid

pd.Series

- 2차원 ndarray가 pd.DataFrame에 대응한다면 1차원 ndarray는 pd.Series에 대응한다.

a=pd.Series(np.random.randn(10))
a
0    0.106173
1    0.723759
2    0.217990
3    0.194022
4   -0.688990
5   -0.351670
6    0.990933
7    1.212147
8   -0.608965
9    0.032549
dtype: float64
type(a)
pandas.core.series.Series
len(a)
10
a.shape
(10,)
for value in a: 
    print(value)
0.10617283591748639
0.7237590624253404
0.21798967912700873
0.1940223087322443
-0.6889899757985083
-0.3516696436204985
0.9909329773184973
1.2121468150185186
-0.6089654373693767
0.03254898346416765

pandas 공부 2단계

- 데이터

np.random.seed(43052)
att = np.random.choice(np.arange(10,21)*5,20)
rep = np.random.choice(np.arange(5,21)*5,20)
mid = np.random.choice(np.arange(0,21)*5,20)
fin = np.random.choice(np.arange(0,21)*5,20)
key = ['2022-12'+str(s) for s in np.random.choice(np.arange(300,501),20,replace=False)]
df = pd.DataFrame({'att':att,'rep':rep,'mid':mid,'fin':fin},index=key)
df.head()
att rep mid fin
2022-12380 65 55 50 40
2022-12370 95 100 50 80
2022-12363 65 90 60 30
2022-12488 55 80 75 80
2022-12312 80 30 30 100

열의 선택

- 방법1: df[] + 칼럼이름, 칼럼이름의 list

# df['att'] # 칼럼이름 
# df[['att']] # 칼럼이름의 list 
# df[['att','rep']] # 칼럼이름의 list 

- 방법2: df.iloc[:,] + 정수, 정수의 list, range, 슬라이싱, 스트라이딩, bool의 list

# df.iloc[:,0] # 정수
# df.iloc[:,[0]] # 정수의 list 
# df.iloc[:,[0,1]] # 정수의 list 
# df.iloc[:,range(2)] # range
# df.iloc[:,-2:] # 슬라이싱
# df.iloc[:,1::2] # 스트라이딩
# df.iloc[:,[True,True,False,False]] # bool의 list 

- 방법3: df.loc[:,] + 칼럼이름, 컬럼이름의 list, 칼럼이름으로 슬라이싱(\(\star\)), 칼럼이름으로 스트라이딩(\(\star\)), bool의 list

# df.loc[:,'att'] # 칼럼이름
# df.loc[:,['att']] # 칼럼이름의 list 
# df.loc[:,['att','rep']] # 칼럼이름의 list 
# df.loc[:,'rep':'mid'] # 칼럼이름으로 슬라이싱 
# df.loc[:,'rep'::2] # 칼럼이름으로 스트라이딩
# df.loc[:,[True,False,False,True]] # bool의 list

행의 선택

여기서는 df=중첩된list 라고 생각해야 코드가 잘 읽힌다.

- 방법1: df.iloc[] + 정수, 정수의리스트, range, 슬라이싱, 스트라이딩, bool의 list

# df.iloc[0] # 정수 
# df.iloc[[0]] # 정수의 list 
# df.iloc[[0,1]] # 정수의 list 
# df.iloc[range(2)] # range
# df.iloc[-2:] # 슬라이싱
# df.iloc[1::2] # 스트라이딩
# df.iloc[[True]+[False]*19] # bool의 list 
# df.iloc[list(df['att']>70)] # bool의 list 

여기서는 df=2차원array라고 생각해야 코드가 잘 읽힌다.

- 방법1: df.iloc[,:] + 정수, 정수의리스트, range, 슬라이싱, 스트라이딩, bool의 list

# df.iloc[0,:] # 정수 
# df.iloc[[0],:] # 정수의 list 
# df.iloc[[0,1],:] # 정수의 list 
# df.iloc[range(2),:] # range
# df.iloc[-2:,:] # 슬라이싱
# df.iloc[1::2,:] # 스트라이딩
# df.iloc[[True]+[False]*19,:] # bool의 list 
# df.iloc[list(df['att']>70),:] # bool의 list 

- 방법2: df.loc[,:] + 인덱스이름의 리스트, 인덱스이름으로 슬라이싱(\(\star\)), 인덱스이름으로 스트라이딩(\(\star\)), bool의 list

# df.loc['2022-12380',:] # 인덱스이름 
# df.loc[['2022-12380','2022-12370'],:] # 인덱스이름의 리스트
# df.loc['2022-12452':,:] # 인덱스이름으로 슬라이싱
# df.loc['2022-12380'::3,:] # 인덱스이름으로 스트라이딩
# df.loc[list(df['att']>70),:] # bool의 list 
# df.loc[df['att']>70,:] # bool의 list 

안썼으면 좋겠는 코드

- 제가 안쓰는 코드1:

df['2022-12380':'2022-12370']
att rep mid fin
2022-12380 65 55 50 40
2022-12370 95 100 50 80

이러면 내 입장에서는 마치 아래가 동작할 것 같잖아..

df['2022-12380']
KeyError: '2022-12380'

- 제가 안쓰는 코드2: bool의 list를 사용할때 iloc은 가급적 쓰지마세요

df.iloc[list(df['att']<80),:]
att rep mid fin
2022-12380 65 55 50 40
2022-12363 65 90 60 30
2022-12488 55 80 75 80
2022-12377 75 40 100 15
2022-12463 65 45 45 90
2022-12471 60 60 25 0
2022-12318 55 75 35 25
2022-12367 50 80 40 30
2022-12458 50 55 15 85
2022-12482 50 50 45 10
2022-12452 65 55 15 45
2022-12387 70 70 40 35

이러면 마치 아래도 동작할 것 같잖아..

df.iloc[df['att']<80,:]
ValueError: Location based indexing can only have [integer, integer slice (START point is INCLUDED, END point is EXCLUDED), listlike of integers, boolean array] types

- 참고: 맨날 틀리는 코드

df.loc['att']
KeyError: 'att'

HW

(1) 아래와 같은 데이터 프레임을 선언하라.

from IPython.core.display import HTML 
HTML('<table border="1" class="dataframe">\n  <thead>\n    <tr style="text-align: right;">\n      <th></th>\n      <th>A</th>\n      <th>B</th>\n    </tr>\n  </thead>\n  <tbody>\n    <tr>\n      <th>0</th>\n      <td>1</td>\n      <td>-2</td>\n    </tr>\n    <tr>\n      <th>1</th>\n      <td>2</td>\n      <td>-3</td>\n    </tr>\n    <tr>\n      <th>2</th>\n      <td>3</td>\n      <td>-4</td>\n    </tr>\n  </tbody>\n</table>')
A B
0 1 -2
1 2 -3
2 3 -4

(풀이)

df = pd.DataFrame({'A':[1,2,3], 'B':[-2,-3,-4]})
df
A B
0 1 -2
1 2 -3
2 3 -4

(2) Column을 이름을 X1, X2로 변경하라. 출력결과는 아래와 같아야 한다.

from IPython.core.display import HTML 
HTML('<table border="1" class="dataframe">\n  <thead>\n    <tr style="text-align: right;">\n      <th></th>\n      <th>X1</th>\n      <th>X2</th>\n    </tr>\n  </thead>\n  <tbody>\n    <tr>\n      <th>0</th>\n      <td>1</td>\n      <td>-2</td>\n    </tr>\n    <tr>\n      <th>1</th>\n      <td>2</td>\n      <td>-3</td>\n    </tr>\n    <tr>\n      <th>2</th>\n      <td>3</td>\n      <td>-4</td>\n    </tr>\n  </tbody>\n</table>')
X1 X2
0 1 -2
1 2 -3
2 3 -4

(풀이)

df.columns = pd.Index(['X1','X2'])
df
X1 X2
0 1 -2
1 2 -3
2 3 -4

(3)-(5) 아래와 같은 자료를 고려하자.

df = pd.DataFrame(np.random.normal(size=(100,5)),columns=list('ABCDE'))
df
A B C D E
0 1.946562 -1.638595 0.904979 -0.227882 -0.799842
1 0.170100 -0.838227 0.022166 0.303538 -1.054184
2 0.499706 -1.883968 -1.581990 -0.345108 0.203482
3 -0.687691 0.859835 -1.117939 -1.022273 0.537917
4 0.833156 0.613239 0.852952 0.144647 -1.798335
... ... ... ... ... ...
95 -1.145590 0.076915 0.647415 0.769156 1.130535
96 0.163508 -0.800183 1.426644 -1.124311 -0.012442
97 0.254376 0.535819 -0.316038 -0.638961 1.517565
98 -0.563598 0.338629 1.036945 -1.321897 -0.335859
99 -1.252642 -0.837554 0.741092 -0.085702 -0.372646

100 rows × 5 columns

(3) B,D열을 선택하라.

(풀이)

df.loc[:,['B','D']]
B D
0 -1.638595 -0.227882
1 -0.838227 0.303538
2 -1.883968 -0.345108
3 0.859835 -1.022273
4 0.613239 0.144647
... ... ...
95 0.076915 0.769156
96 -0.800183 -1.124311
97 0.535819 -0.638961
98 0.338629 -1.321897
99 -0.837554 -0.085702

100 rows × 2 columns

(4) 마지막 10개의 row를 출력하라.

(풀이)

df.iloc[-10:]
A B C D E
90 1.341635 -1.913603 0.772789 -0.194342 -1.525831
91 -0.435593 0.838893 0.391487 1.431784 -2.605188
92 1.730139 -1.011555 2.657746 -0.321032 0.859334
93 1.182646 -0.686453 0.602027 -0.299576 1.152503
94 -0.633943 0.903606 0.907359 0.702925 0.796881
95 -1.145590 0.076915 0.647415 0.769156 1.130535
96 0.163508 -0.800183 1.426644 -1.124311 -0.012442
97 0.254376 0.535819 -0.316038 -0.638961 1.517565
98 -0.563598 0.338629 1.036945 -1.321897 -0.335859
99 -1.252642 -0.837554 0.741092 -0.085702 -0.372646

(5) A,B 열의 처음 10개의 row를 출력하라.

(풀이)

df.loc[:,['A','B']].iloc[:10]
A B
0 1.946562 -1.638595
1 0.170100 -0.838227
2 0.499706 -1.883968
3 -0.687691 0.859835
4 0.833156 0.613239
5 1.926216 -0.325002
6 0.447922 -0.423170
7 -0.704128 -0.266632
8 0.164136 -0.768728
9 -0.264639 0.778706

(6)-(9) 아래와 같은 자료를 고려하자.

df=pd.read_csv('https://raw.githubusercontent.com/PacktPublishing/Pandas-Cookbook/master/data/movie.csv')
df
color director_name num_critic_for_reviews duration director_facebook_likes actor_3_facebook_likes actor_2_name actor_1_facebook_likes gross genres ... num_user_for_reviews language country content_rating budget title_year actor_2_facebook_likes imdb_score aspect_ratio movie_facebook_likes
0 Color James Cameron 723.0 178.0 0.0 855.0 Joel David Moore 1000.0 760505847.0 Action|Adventure|Fantasy|Sci-Fi ... 3054.0 English USA PG-13 237000000.0 2009.0 936.0 7.9 1.78 33000
1 Color Gore Verbinski 302.0 169.0 563.0 1000.0 Orlando Bloom 40000.0 309404152.0 Action|Adventure|Fantasy ... 1238.0 English USA PG-13 300000000.0 2007.0 5000.0 7.1 2.35 0
2 Color Sam Mendes 602.0 148.0 0.0 161.0 Rory Kinnear 11000.0 200074175.0 Action|Adventure|Thriller ... 994.0 English UK PG-13 245000000.0 2015.0 393.0 6.8 2.35 85000
3 Color Christopher Nolan 813.0 164.0 22000.0 23000.0 Christian Bale 27000.0 448130642.0 Action|Thriller ... 2701.0 English USA PG-13 250000000.0 2012.0 23000.0 8.5 2.35 164000
4 NaN Doug Walker NaN NaN 131.0 NaN Rob Walker 131.0 NaN Documentary ... NaN NaN NaN NaN NaN NaN 12.0 7.1 NaN 0
... ... ... ... ... ... ... ... ... ... ... ... ... ... ... ... ... ... ... ... ... ...
4911 Color Scott Smith 1.0 87.0 2.0 318.0 Daphne Zuniga 637.0 NaN Comedy|Drama ... 6.0 English Canada NaN NaN 2013.0 470.0 7.7 NaN 84
4912 Color NaN 43.0 43.0 NaN 319.0 Valorie Curry 841.0 NaN Crime|Drama|Mystery|Thriller ... 359.0 English USA TV-14 NaN NaN 593.0 7.5 16.00 32000
4913 Color Benjamin Roberds 13.0 76.0 0.0 0.0 Maxwell Moody 0.0 NaN Drama|Horror|Thriller ... 3.0 English USA NaN 1400.0 2013.0 0.0 6.3 NaN 16
4914 Color Daniel Hsia 14.0 100.0 0.0 489.0 Daniel Henney 946.0 10443.0 Comedy|Drama|Romance ... 9.0 English USA PG-13 NaN 2012.0 719.0 6.3 2.35 660
4915 Color Jon Gunn 43.0 90.0 16.0 16.0 Brian Herzlinger 86.0 85222.0 Documentary ... 84.0 English USA PG 1100.0 2004.0 23.0 6.6 1.85 456

4916 rows × 28 columns

(6) 이 데이터프레임에는 몇개의 컬럼이 있는지 count하라.

hint: df.columns의 len을 조사

(풀이)

len(df.columns)
28

(7) 데이터프레임의 컬럼이름이 c혹은 d로 시작하는 열은 몇개 있는지 세어보라.

hint: 아래의 코드를 관찰

lst = ['color', 'director_name', 'num_critic_for_reviews', 'duration'] 
[l for l in lst if l[0]=='c' or l[0]=='d']
['color', 'director_name', 'duration']

(풀이)

[l for l in df.columns if l[0]=='c' or l[0]=='d']
['color',
 'director_name',
 'duration',
 'director_facebook_likes',
 'cast_total_facebook_likes',
 'country',
 'content_rating']
len([l for l in df.columns if l[0]=='c' or l[0]=='d'])
7

(8) 이 데이터프레임에서 ’actor’라는 단어가 포함된 열이 몇개있는지 세어보라.

(풀이)

[l for l in df.columns if 'actor' in l]
['actor_3_facebook_likes',
 'actor_2_name',
 'actor_1_facebook_likes',
 'actor_1_name',
 'actor_3_name',
 'actor_2_facebook_likes']
len([l for l in df.columns if 'actor' in l])
6

(9) 이 데이터프레임에서 ’actor’라는 단어가 포함된 열을 출력하라.

hint: 아래의 코드를 관찰하라.

_df = pd.DataFrame(
    np.random.randint(1,200,size=(100,2)),
    columns=['director_facebook_likes', 'actor_3_facebook_likes']
)
_df
director_facebook_likes actor_3_facebook_likes
0 33 70
1 40 136
2 85 53
3 127 38
4 38 53
... ... ...
95 51 43
96 155 184
97 138 97
98 44 2
99 166 71

100 rows × 2 columns

_df.loc[:,['actor' in colname for colname in _df.columns]]
actor_3_facebook_likes
0 70
1 136
2 53
3 38
4 53
... ...
95 43
96 184
97 97
98 2
99 71

100 rows × 1 columns

(풀이)

df.loc[:, ['actor' in l for l in df.columns]]
actor_3_facebook_likes actor_2_name actor_1_facebook_likes actor_1_name actor_3_name actor_2_facebook_likes
0 855.0 Joel David Moore 1000.0 CCH Pounder Wes Studi 936.0
1 1000.0 Orlando Bloom 40000.0 Johnny Depp Jack Davenport 5000.0
2 161.0 Rory Kinnear 11000.0 Christoph Waltz Stephanie Sigman 393.0
3 23000.0 Christian Bale 27000.0 Tom Hardy Joseph Gordon-Levitt 23000.0
4 NaN Rob Walker 131.0 Doug Walker NaN 12.0
... ... ... ... ... ... ...
4911 318.0 Daphne Zuniga 637.0 Eric Mabius Crystal Lowe 470.0
4912 319.0 Valorie Curry 841.0 Natalie Zea Sam Underwood 593.0
4913 0.0 Maxwell Moody 0.0 Eva Boehnke David Chandler 0.0
4914 489.0 Daniel Henney 946.0 Alan Ruck Eliza Coupe 719.0
4915 16.0 Brian Herzlinger 86.0 John August Jon Gunn 23.0

4916 rows × 6 columns