import numpy as np
import pandas as pd
08wk-1: Pandas (1)
강의영상
youtube: https://youtube.com/playlist?list=PLQqh36zP38-xqAT5XH-YhYj1s2WQWhKE8
import
pandas 개발동기
부분 데이터 꺼내기: 판다스를 왜 써야할까?
-
예시1: 때로는 인덱스로 때로는 key로 데이터를 부르고 싶다.
43052)
np.random.seed(= np.random.choice(np.arange(10,21)*5,20)
att = np.random.choice(np.arange(5,21)*5,20)
rep = np.random.choice(np.arange(0,21)*5,20)
mid = np.random.choice(np.arange(0,21)*5,20)
fin = ['2022-12'+str(s) for s in np.random.choice(np.arange(300,501),20,replace=False)] key
학번 ’2022-12363’에 해당하는 학생의 출석점수를 알고 싶다면?
(풀이1) – dct로 자료를 저장하고 출력
= {'att':{key[i]:att[i] for i in range(20)},
dct '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
'att']['2022-12363'] dct[
65
(풀이2) – ndarray로 자료를 저장하고 출력
= np.array([att,rep,mid,fin,key]).T
arr 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')
-1] == '2022-12363',0] # 읽기어려운 코드 arr[arr[:,
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
= pd.DataFrame(dct)
df 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
= pd.DataFrame({'att':att,'rep':rep,'mid':mid,'fin':fin},index=key)
df 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']
'att'] df[
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']
'att']['2022-12380'] df[
65
인덱싱으로 정보를 뽑는 기능도 지원을 하면 좋겠다 (마치 리스트나 넘파이처럼)
-
예제1: 첫번째 학생의 기말고사 성적을 출력하고 싶다.
0,-1] df.iloc[
40
- 벼락치기: df에서 iloc이라는 특수기능을 이용하면 넘파이 인덱싱처럼 원소출력이 가능하다.
df는 딕셔너리 같은것이지만 df.iloc은 넘파이같은것이라고 생각하면 된다.
-
예제2: 홀수번째 학생 의 점수를 뽑고 싶다. (홀수번째 학생은 인덱스 0,2,4,… 에 대응)
2,:] df.iloc[::
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명의 점수를 출력하고 싶다.
-3:,:] df.iloc[
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개의 칼럼만 출력하고 싶다.
-3:,-2:] df.iloc[
mid | fin | |
---|---|---|
2022-12452 | 15 | 45 |
2022-12387 | 40 | 35 |
2022-12354 | 80 | 90 |
궁극: 해싱과 인덱싱을 모두 지원하는 아주 우수한 자료형을 만들고 싶음
-
예제1: ’mid >= 20 and att <60’인 학생들의 ’fin’을 출력
(방법1) query
- 데이터베이스 스타일
'mid>=20 and att<60')['fin'] df.query(
2022-12488 80
2022-12318 25
2022-12367 30
2022-12482 10
Name: fin, dtype: int64
(방법2) numpy
2].astype(dtype=np.int64) >= 20) & (arr[:,0].astype(dtype=np.int64) < 60),3] arr[(arr[:,
array(['80', '25', '30', '10'], dtype='<U21')
-
예제2: ’중간고사점수<기말고사점수’인 학생들의 출석점수 평균을 구하자.
'mid<fin')['att'].mean() df.query(
76.66666666666667
pandas 공부 1단계
데이터프레임 선언
-
방법1: dictionary에서 만든다.
'att':[30,40,50],'mid':[50,60,70]}) pd.DataFrame({
att | mid | |
---|---|---|
0 | 30 | 50 |
1 | 40 | 60 |
2 | 50 | 70 |
'att':(30,40,50),'mid':(50,60,70)}) pd.DataFrame({
att | mid | |
---|---|---|
0 | 30 | 50 |
1 | 40 | 60 |
2 | 50 | 70 |
'att':np.array([30,40,50]),'mid':np.array([50,60,70])}) pd.DataFrame({
att | mid | |
---|---|---|
0 | 30 | 50 |
1 | 40 | 60 |
2 | 50 | 70 |
-
방법: 2차원 ndarray에서 만든다.
2*3).reshape(2,3) np.arange(
array([[0, 1, 2],
[3, 4, 5]])
2*3).reshape(2,3)) pd.DataFrame(np.arange(
0 | 1 | 2 | |
---|---|---|---|
0 | 0 | 1 | 2 |
1 | 3 | 4 | 5 |
열의 이름 부여
-
방법1: 딕셔너리를 통하여 만들면 딕셔너리의 key가 자동으로 열의 이름이 된다.
'att':np.array([30,40,50]),'mid':np.array([50,60,70])}) pd.DataFrame({
att | mid | |
---|---|---|
0 | 30 | 50 |
1 | 40 | 60 |
2 | 50 | 70 |
-
방법2: pd.DataFrame()의 옵션에 columns를 이용
2*3).reshape(2,3),columns=['X1','X2','X3']) pd.DataFrame(np.arange(
X1 | X2 | X3 | |
---|---|---|---|
0 | 0 | 1 | 2 |
1 | 3 | 4 | 5 |
-
방법3: df.columns에 원하는 열이름을 덮어씀 (1)
=pd.DataFrame(np.arange(2*3).reshape(2,3))
df df
0 | 1 | 2 | |
---|---|---|---|
0 | 0 | 1 | 2 |
1 | 3 | 4 | 5 |
= ['X1','X2','X3']
df.columns df
X1 | X2 | X3 | |
---|---|---|---|
0 | 0 | 1 | 2 |
1 | 3 | 4 | 5 |
-
방법4: df.columns에 원하는 열이름을 덮어씀 (2)
=pd.DataFrame(np.arange(2*3).reshape(2,3))
df df
0 | 1 | 2 | |
---|---|---|---|
0 | 0 | 1 | 2 |
1 | 3 | 4 | 5 |
= pd.Index(['X1','X2','X3']) df.columns
df
X1 | X2 | X3 | |
---|---|---|---|
0 | 0 | 1 | 2 |
1 | 3 | 4 | 5 |
방법4가 방법3의 방식보다 컴퓨터가 이해하기 좋다. (= 불필요한 에러 혹은 경고메시지를 방지할 수 있다)
행의 이름 부여
-
방법1: 중첩 dict이면 nested dic의 key가 알아서 행의 이름으로 된다.
'att':{'guebin':30, 'iu':40, 'hynn':50} , 'mid':{'guebin':5, 'iu':45, 'hynn':90}}) pd.DataFrame({
att | mid | |
---|---|---|
guebin | 30 | 5 |
iu | 40 | 45 |
hynn | 50 | 90 |
-
방법2: pd.DataFrame()의 index 옵션 이용
'att':[30,40,50] , 'mid':[5,45,90]},index=['guebin','iu','hynn']) pd.DataFrame({
att | mid | |
---|---|---|
guebin | 30 | 5 |
iu | 40 | 45 |
hynn | 50 | 90 |
-
방법3: df.index에 덮어씌움
=pd.DataFrame({'att':[30,40,50] , 'mid':[5,45,90]})
df df
att | mid | |
---|---|---|
0 | 30 | 5 |
1 | 40 | 45 |
2 | 50 | 90 |
= pd.Index(['guebin','iu','hynn'])
df.index #df.index = ['guebin','iu','hynn'] <- 이것도 실행가능하기는함
df
att | mid | |
---|---|---|
guebin | 30 | 5 |
iu | 40 | 45 |
hynn | 50 | 90 |
-
방법4: df.set_index() 를 이용하여 덮어씌운다
=pd.DataFrame({'att':[30,40,50] , 'mid':[5,45,90]})
df df
att | mid | |
---|---|---|
0 | 30 | 5 |
1 | 40 | 45 |
2 | 50 | 90 |
'guebin','iu','hynn'])) df.set_index(pd.Index([
att | mid | |
---|---|---|
guebin | 30 | 5 |
iu | 40 | 45 |
hynn | 50 | 90 |
'guebin','iu','hynn']) df.set_index([
KeyError: "None of ['guebin', 'iu', 'hynn'] are in the columns"
'guebin','iu','hynn']]) # 꺽쇠를 한번 더 넣어주면 에러를 피할수 있다. df.set_index([[
att | mid | |
---|---|---|
guebin | 30 | 5 |
iu | 40 | 45 |
hynn | 50 | 90 |
- 그러나 이런 코드를 권장하지 않음
자료형, len, shape, for문의 반복변수
= pd.DataFrame({'att':[30,40,50],'mid':[5,45,90]})
df 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에 대응한다.
=pd.Series(np.random.randn(10))
a 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단계
-
데이터
43052)
np.random.seed(= np.random.choice(np.arange(10,21)*5,20)
att = np.random.choice(np.arange(5,21)*5,20)
rep = np.random.choice(np.arange(0,21)*5,20)
mid = np.random.choice(np.arange(0,21)*5,20)
fin = ['2022-12'+str(s) for s in np.random.choice(np.arange(300,501),20,replace=False)] key
= pd.DataFrame({'att':att,'rep':rep,'mid':mid,'fin':fin},index=key)
df 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:
'2022-12380':'2022-12370'] df[
att | rep | mid | fin | |
---|---|---|---|---|
2022-12380 | 65 | 55 | 50 | 40 |
2022-12370 | 95 | 100 | 50 | 80 |
이러면 내 입장에서는 마치 아래가 동작할 것 같잖아..
'2022-12380'] df[
KeyError: '2022-12380'
-
제가 안쓰는 코드2: bool의 list를 사용할때 iloc은 가급적 쓰지마세요
list(df['att']<80),:] df.iloc[
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 |
이러면 마치 아래도 동작할 것 같잖아..
'att']<80,:] df.iloc[df[
ValueError: Location based indexing can only have [integer, integer slice (START point is INCLUDED, END point is EXCLUDED), listlike of integers, boolean array] types
-
참고: 맨날 틀리는 코드
'att'] df.loc[
KeyError: 'att'
HW
(1)
아래와 같은 데이터 프레임을 선언하라.
from IPython.core.display import 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>') HTML(
A | B | |
---|---|---|
0 | 1 | -2 |
1 | 2 | -3 |
2 | 3 | -4 |
(풀이)
= pd.DataFrame({'A':[1,2,3], 'B':[-2,-3,-4]})
df df
A | B | |
---|---|---|
0 | 1 | -2 |
1 | 2 | -3 |
2 | 3 | -4 |
(2)
Column을 이름을 X1, X2로 변경하라. 출력결과는 아래와 같아야 한다.
from IPython.core.display import 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>') HTML(
X1 | X2 | |
---|---|---|
0 | 1 | -2 |
1 | 2 | -3 |
2 | 3 | -4 |
(풀이)
= pd.Index(['X1','X2'])
df.columns df
X1 | X2 | |
---|---|---|
0 | 1 | -2 |
1 | 2 | -3 |
2 | 3 | -4 |
(3)-(5)
아래와 같은 자료를 고려하자.
= pd.DataFrame(np.random.normal(size=(100,5)),columns=list('ABCDE'))
df 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열을 선택하라.
(풀이)
'B','D']] df.loc[:,[
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를 출력하라.
(풀이)
-10:] df.iloc[
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를 출력하라.
(풀이)
'A','B']].iloc[:10] df.loc[:,[
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)
아래와 같은 자료를 고려하자.
=pd.read_csv('https://raw.githubusercontent.com/PacktPublishing/Pandas-Cookbook/master/data/movie.csv')
df 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: 아래의 코드를 관찰
= ['color', 'director_name', 'num_critic_for_reviews', 'duration']
lst for l in lst if l[0]=='c' or l[0]=='d'] [l
['color', 'director_name', 'duration']
(풀이)
for l in df.columns if l[0]=='c' or l[0]=='d'] [l
['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’라는 단어가 포함된 열이 몇개있는지 세어보라.
(풀이)
for l in df.columns if 'actor' in l] [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: 아래의 코드를 관찰하라.
= pd.DataFrame(
_df 1,200,size=(100,2)),
np.random.randint(=['director_facebook_likes', 'actor_3_facebook_likes']
columns
) _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
'actor' in colname for colname in _df.columns]] _df.loc[:,[
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
(풀이)
'actor' in l for l in df.columns]] df.loc[:, [
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