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 스타일도 유용하다는 것은 이해함
엑셀처럼 데이터를 테이블 형태로 정리하고 싶다
(방법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, 칼럼이름으로 슬라이싱(
# 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[,:]
+ 인덱스이름의 리스트, 인덱스이름으로 슬라이싱(
# 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