lambda, map, 판다스–인덱싱(1)
강의영상
https://youtube.com/playlist?list=PLQqh36zP38-wxe8lWPtjKVy-D10Ul4E_7
imports
lambda, map (\(\star\))
lambda
-
예제1: 람다표현식(lambda expression)자체가 하나의 오브젝트임
<function __main__.<lambda>(x)>
- “lambda x: (x-2)**2” 는 \(lambda(x)=(x-2)^2\)의 느낌으로 기억하면 쉬움
(사용방법)
-
예제2: 람다표현식에 이름을 줄 수 있음.
위의 코드는 아래와 같다.
-
예제3: 조건부 출력
-
예제4: 람다표현식들의 리스트
-
예제5: 람다표현식들의 딕셔너리
{'f1': <function __main__.<lambda>(x)>,
'f2': <function __main__.<lambda>(x)>,
'f3': <function __main__.<lambda>(x)>}
-
예제6: 람다표현식을 리턴하는 함수 (함수를 리턴하는 함수)
(예비학습) 함수 \(g(x)\)가 정의되어 있을때 \(\frac{d}{dx}g(x)\)의 값을 계산해보기
(목표) 도함수를 구해주는 derivate
함수를 정의하자. 이 함수는 임의의 함수 g를 입력으로 받으면, g의 도함수(gg)가 리턴되는 기능을 가진다.
(사용1)
plt.plot(x,g(x),label=r'$f(x)=sin(x)$')
plt.plot(x,gg(x),label=r'$\frac{d}{dx}f(x)=cos(x)$')
plt.legend(fontsize=15)
<matplotlib.legend.Legend at 0x7fa54cde3a50>
(사용2)
x = np.linspace(-1,1,100)
plt.plot(x,g0(x),'--',label=r'$g_0(x)=\frac{1}{6}x^3$')
plt.plot(x,g1(x),'--',label=r'$g_1(x)=\frac{1}{2}x^2$')
plt.plot(x,g2(x),'--',label=r'$g_2(x)=x$')
plt.legend(fontsize=15)
<matplotlib.legend.Legend at 0x7fa54cccc2d0>
-
예제7: 예제6의 다른표현
(사용1)
plt.plot(x,g(x),label=r'$f(x)=sin(x)$')
plt.plot(x,gg(x),label=r'$\frac{d}{dx}f(x)=cos(x)$')
plt.legend(fontsize=15)
<matplotlib.legend.Legend at 0x7fa54cdb1b10>
(사용2)
map
-
개념: $(f,[x_1,x_2,,x_n] )=$
-
예제1:
(다른구현1)
(다른구현2)
(다른구현3)
(다른구현4)–최악
(다른구현5)–더 최악
-
예제2: 문자열을 입력으로 받고 대문자이면 True, 소문자이면 False
입력: A,B,C,a,b,c
출력: T,T,T,F,F,F
-
예제3: 두개의 입력을 받는 함수 (map을 이용하는 것이 리스트 컴프리헨션보다 조금 편한것 같다)
(다른구현)– 리스트컴프리헨션
-
예제4: map은 “하나의 함수에 다양한 입력”을 적용하는 경우에만 사용가능, 리스트컴프리헨션은 “다양한 함수에 다양한 입력” 지원
map으로 구현시도 \(\to\) 실패
리스트컴프리헨션으로 구현시도 \(\to\) 성공
-
종합: map과 리스트컴프리헨션과 비교
- map은 for문을 위한 \(i\)등의 인덱스를 쓰지 않지만 리스트컴프리헨션은 필요함
- map은 좀더 리스트컴프리헨션보다 제약적으로 사용할 수 밖에 없음.
판다스: 인덱싱 1단계– 인덱싱의 4가지 컨셉
데이터프레임 준비
-
데이터준비
att | rep | mid | fin | |
---|---|---|---|---|
0 | 65 | 45 | 0 | 10 |
1 | 95 | 30 | 60 | 10 |
2 | 65 | 85 | 15 | 20 |
3 | 55 | 35 | 35 | 5 |
4 | 80 | 60 | 55 | 70 |
... | ... | ... | ... | ... |
195 | 55 | 70 | 40 | 95 |
196 | 65 | 85 | 25 | 85 |
197 | 85 | 85 | 100 | 10 |
198 | 80 | 65 | 35 | 60 |
199 | 50 | 95 | 45 | 85 |
200 rows × 4 columns
-
앞으로는 위와 같은 df형태를 가정할 것이다. 즉 column의 이름은 문자열, row의 이름은 0부터 시작하는 정수로 가정한다.
-
아래와 같은 형태는 일단 생각하지 않는다.
df의 4가지 컨셉
-
원소에 접근하는 4가지 방법: .
, []
, .iloc[]
, .loc[]
컨셉1: 클래스느낌
-
컨셉1: df는 인스턴스이다. 그리고 df.att, df.rep,df.mid, df.fin 와 같이 col이름에 대응하는 속성이 있다.
0 10
1 10
2 20
3 5
4 70
..
195 95
196 85
197 10
198 60
199 85
Name: fin, Length: 200, dtype: int64
-
언제유용? col의 이름을 대충 알고 있을 경우 자동완성으로 쉽게 선택가능
컨셉2: 딕셔너리 + \(\alpha\) 느낌
-
컨셉2: df는 컬럼이름이 key, 컬럼의데이터가 value가 되는 dictionary로 이해할 수 있다. 즉 아래의 dct와 같은 딕셔너리로 이해할 수 있다.
(예시) .keys() 메소드를 이용하여 컬럼들의 이름을 살펴볼 수 있음.
(dict_keys(['att', 'rep', 'mid', 'fin']),
Index(['att', 'rep', 'mid', 'fin'], dtype='object'))
#
col indexing
-
예시1: dct가 가능하면 df도 가능하다.
0 65
1 95
2 65
3 55
4 80
..
195 55
196 65
197 85
198 80
199 50
Name: att, Length: 200, dtype: int64
-
예시2: dct가 가능하면 df도 가능하다. (2)
0 65
1 95
2 65
3 55
4 80
..
195 55
196 65
197 85
198 80
199 50
Name: att, Length: 200, dtype: int64
-
예시3: dct에서 불가능하지만 df에서 가능한것도 있다.
att | rep | |
---|---|---|
0 | 65 | 45 |
1 | 95 | 30 |
2 | 65 | 85 |
3 | 55 | 35 |
4 | 80 | 60 |
... | ... | ... |
195 | 55 | 70 |
196 | 65 | 85 |
197 | 85 | 85 |
198 | 80 | 65 |
199 | 50 | 95 |
200 rows × 2 columns
-
예시4: dct에서 불가능하지만 df에서 가능한것도 있다. (2)
#
row indexing
-
예시5: dct에서 불가능하지만 df에서 가능한것도 있다. (3)
컨셉3: 넘파이느낌
-
컨셉3: df.iloc
은 넘파이에러이처럼 생각가능하다. 즉 아래의 arr와 같은 넘파이어레이로 생각가능하다.
#
row indexing
-
예시1: 단일레이블
-
예시2: 레이블의 리스트
array([[65, 45, 0, 10],
[95, 30, 60, 10],
[65, 85, 15, 20]])
att | rep | mid | fin | |
---|---|---|---|---|
0 | 65 | 45 | 0 | 10 |
1 | 95 | 30 | 60 | 10 |
2 | 65 | 85 | 15 | 20 |
-
예시3: 슬랑이싱
array([[65, 45, 0, 10],
[95, 30, 60, 10],
[65, 85, 15, 20]])
#
col indexing
-
예시1: 단일레이블
0 65
1 95
2 65
3 55
4 80
..
195 55
196 65
197 85
198 80
199 50
Name: att, Length: 200, dtype: int64
-
예시2: 레이블의 리스트
att | mid | |
---|---|---|
0 | 65 | 0 |
1 | 95 | 60 |
2 | 65 | 15 |
3 | 55 | 35 |
4 | 80 | 55 |
... | ... | ... |
195 | 55 | 40 |
196 | 65 | 25 |
197 | 85 | 100 |
198 | 80 | 35 |
199 | 50 | 45 |
200 rows × 2 columns
-
예시3: 슬랑이싱
#
row + col indexing
컨셉4: 데이터프레임 느낌
-
컨셉4: df.loc
은 새로운 느낌.. (R에 익숙하면 df.loc
이 dataframe 혹은 티블느낌이라고 보시면 됩니다)
# A tibble: 5 × 2
model year
<chr> <int>
1 a4 1999
2 a4 1999
3 a4 2008
4 a4 2008
5 a4 1999
#
row indexing
-
예시1: 단일레이블
-
예시2: 레이블의 리스트
att | rep | mid | fin | |
---|---|---|---|---|
0 | 65 | 45 | 0 | 10 |
1 | 95 | 30 | 60 | 10 |
2 | 65 | 85 | 15 | 20 |
-
예시3: 슬라이싱 (끝점포함 O)
#
col indexing
-
예시1: 단일레이블
0 65
1 95
2 65
3 55
4 80
..
195 55
196 65
197 85
198 80
199 50
Name: att, Length: 200, dtype: int64
-
예시2: 레이블의 리스트
att | mid | |
---|---|---|
0 | 65 | 0 |
1 | 95 | 60 |
2 | 65 | 15 |
3 | 55 | 35 |
4 | 80 | 55 |
... | ... | ... |
195 | 55 | 40 |
196 | 65 | 25 |
197 | 85 | 100 |
198 | 80 | 35 |
199 | 50 | 45 |
200 rows × 2 columns
-
예시3: 슬라이싱 (끝점포함 O)
#
row + col indexing
컨셉1~4 정리
. |
[] |
.iloc |
.loc |
|
---|---|---|---|---|
row/단일레이블 | X | X | O | O |
col/단일레이블 | O | O | O | O |
row/레이블리스트 | X | X | O | O |
col/레이블리스트 | X | O | O | O |
row/슬라이싱 | X | O | O | O |
col/슬라이싱 | X | X | O | O |
-
col 이름을 알아야하는 부담감 - .
: 앞글자만 대충 알아도 자동완성 가능 - []
: 정확한 col 이름을 알아야 함 - .loc
: 보통 정확한 col 이름을 알아야 하지만 슬라이싱 이용시 양 끝의 컬럼이름만 알면 무방 - .iloc
: 정확한 col 이름을 몰라도 번호로 인덱싱 가능
-
자주하는 실수
판다스: 인덱싱 2단계– 필터링(특정조건에 맞는 row를 선택)
att > 90 and rep < 50
-
방법1: .query()를 이용
att | rep | mid | fin | |
---|---|---|---|---|
1 | 95 | 30 | 60 | 10 |
12 | 95 | 35 | 0 | 25 |
48 | 95 | 45 | 35 | 80 |
56 | 95 | 25 | 95 | 90 |
78 | 95 | 45 | 90 | 35 |
107 | 100 | 30 | 60 | 65 |
112 | 100 | 35 | 70 | 0 |
113 | 95 | 45 | 55 | 65 |
163 | 100 | 25 | 10 | 20 |
174 | 100 | 40 | 40 | 15 |
176 | 100 | 30 | 70 | 70 |
184 | 100 | 30 | 30 | 85 |
190 | 95 | 35 | 40 | 95 |
192 | 100 | 40 | 80 | 80 |
att | rep | mid | fin | |
---|---|---|---|---|
1 | 95 | 30 | 60 | 10 |
12 | 95 | 35 | 0 | 25 |
48 | 95 | 45 | 35 | 80 |
56 | 95 | 25 | 95 | 90 |
78 | 95 | 45 | 90 | 35 |
107 | 100 | 30 | 60 | 65 |
112 | 100 | 35 | 70 | 0 |
113 | 95 | 45 | 55 | 65 |
163 | 100 | 25 | 10 | 20 |
174 | 100 | 40 | 40 | 15 |
176 | 100 | 30 | 70 | 70 |
184 | 100 | 30 | 30 | 85 |
190 | 95 | 35 | 40 | 95 |
192 | 100 | 40 | 80 | 80 |
att | rep | mid | fin | |
---|---|---|---|---|
1 | 95 | 30 | 60 | 10 |
12 | 95 | 35 | 0 | 25 |
48 | 95 | 45 | 35 | 80 |
56 | 95 | 25 | 95 | 90 |
78 | 95 | 45 | 90 | 35 |
107 | 100 | 30 | 60 | 65 |
112 | 100 | 35 | 70 | 0 |
113 | 95 | 45 | 55 | 65 |
163 | 100 | 25 | 10 | 20 |
174 | 100 | 40 | 40 | 15 |
176 | 100 | 30 | 70 | 70 |
184 | 100 | 30 | 30 | 85 |
190 | 95 | 35 | 40 | 95 |
192 | 100 | 40 | 80 | 80 |
-
방법2: [], .iloc
, .loc
df[(df.att > 90)&(df.rep < 50)]
df.loc[(df.att > 90)&(df.rep < 50)]
df.iloc[list((df.att > 90)&(df.rep < 50))]
att | rep | mid | fin | |
---|---|---|---|---|
1 | 95 | 30 | 60 | 10 |
12 | 95 | 35 | 0 | 25 |
48 | 95 | 45 | 35 | 80 |
56 | 95 | 25 | 95 | 90 |
78 | 95 | 45 | 90 | 35 |
107 | 100 | 30 | 60 | 65 |
112 | 100 | 35 | 70 | 0 |
113 | 95 | 45 | 55 | 65 |
163 | 100 | 25 | 10 | 20 |
174 | 100 | 40 | 40 | 15 |
176 | 100 | 30 | 70 | 70 |
184 | 100 | 30 | 30 | 85 |
190 | 95 | 35 | 40 | 95 |
192 | 100 | 40 | 80 | 80 |
-
방법3: [], .iloc
, .loc
// map, lambda
df[list(map(lambda x,y: (x>90)&(y<50), df.att, df.rep))]
# df[map(lambda x,y: (x>90)&(y<50), df.att, df.rep)] # 이것은 불가능
att | rep | mid | fin | |
---|---|---|---|---|
1 | 95 | 30 | 60 | 10 |
12 | 95 | 35 | 0 | 25 |
48 | 95 | 45 | 35 | 80 |
56 | 95 | 25 | 95 | 90 |
78 | 95 | 45 | 90 | 35 |
107 | 100 | 30 | 60 | 65 |
112 | 100 | 35 | 70 | 0 |
113 | 95 | 45 | 55 | 65 |
163 | 100 | 25 | 10 | 20 |
174 | 100 | 40 | 40 | 15 |
176 | 100 | 30 | 70 | 70 |
184 | 100 | 30 | 30 | 85 |
190 | 95 | 35 | 40 | 95 |
192 | 100 | 40 | 80 | 80 |
df.iloc[list(map(lambda x,y: (x>90)&(y<50), df.att, df.rep))]
df.iloc[map(lambda x,y: (x>90)&(y<50), df.att, df.rep)]
att | rep | mid | fin | |
---|---|---|---|---|
1 | 95 | 30 | 60 | 10 |
12 | 95 | 35 | 0 | 25 |
48 | 95 | 45 | 35 | 80 |
56 | 95 | 25 | 95 | 90 |
78 | 95 | 45 | 90 | 35 |
107 | 100 | 30 | 60 | 65 |
112 | 100 | 35 | 70 | 0 |
113 | 95 | 45 | 55 | 65 |
163 | 100 | 25 | 10 | 20 |
174 | 100 | 40 | 40 | 15 |
176 | 100 | 30 | 70 | 70 |
184 | 100 | 30 | 30 | 85 |
190 | 95 | 35 | 40 | 95 |
192 | 100 | 40 | 80 | 80 |
df.loc[list(map(lambda x,y: (x>90)&(y<50), df.att, df.rep))]
df.loc[map(lambda x,y: (x>90)&(y<50), df.att, df.rep)]
att | rep | mid | fin | |
---|---|---|---|---|
1 | 95 | 30 | 60 | 10 |
12 | 95 | 35 | 0 | 25 |
48 | 95 | 45 | 35 | 80 |
56 | 95 | 25 | 95 | 90 |
78 | 95 | 45 | 90 | 35 |
107 | 100 | 30 | 60 | 65 |
112 | 100 | 35 | 70 | 0 |
113 | 95 | 45 | 55 | 65 |
163 | 100 | 25 | 10 | 20 |
174 | 100 | 40 | 40 | 15 |
176 | 100 | 30 | 70 | 70 |
184 | 100 | 30 | 30 | 85 |
190 | 95 | 35 | 40 | 95 |
192 | 100 | 40 | 80 | 80 |
att > mean(att)
-
방법1: .query()를 이용
att | rep | mid | fin | |
---|---|---|---|---|
1 | 95 | 30 | 60 | 10 |
4 | 80 | 60 | 55 | 70 |
8 | 95 | 55 | 65 | 90 |
9 | 90 | 25 | 95 | 50 |
11 | 95 | 60 | 25 | 55 |
... | ... | ... | ... | ... |
184 | 100 | 30 | 30 | 85 |
190 | 95 | 35 | 40 | 95 |
192 | 100 | 40 | 80 | 80 |
197 | 85 | 85 | 100 | 10 |
198 | 80 | 65 | 35 | 60 |
95 rows × 4 columns
-
방법2: [], .iloc
, .loc
att | rep | mid | fin | |
---|---|---|---|---|
1 | 95 | 30 | 60 | 10 |
4 | 80 | 60 | 55 | 70 |
8 | 95 | 55 | 65 | 90 |
9 | 90 | 25 | 95 | 50 |
11 | 95 | 60 | 25 | 55 |
... | ... | ... | ... | ... |
184 | 100 | 30 | 30 | 85 |
190 | 95 | 35 | 40 | 95 |
192 | 100 | 40 | 80 | 80 |
197 | 85 | 85 | 100 | 10 |
198 | 80 | 65 | 35 | 60 |
95 rows × 4 columns
-
방법3: [], .iloc
, .loc
// map, lambda
df[list(map(lambda x: x>df.att.mean() , df.att))]
# df[map(lambda x: x>df.att.mean() , df.att)] # 이것은 불가능
att | rep | mid | fin | |
---|---|---|---|---|
1 | 95 | 30 | 60 | 10 |
4 | 80 | 60 | 55 | 70 |
8 | 95 | 55 | 65 | 90 |
9 | 90 | 25 | 95 | 50 |
11 | 95 | 60 | 25 | 55 |
... | ... | ... | ... | ... |
184 | 100 | 30 | 30 | 85 |
190 | 95 | 35 | 40 | 95 |
192 | 100 | 40 | 80 | 80 |
197 | 85 | 85 | 100 | 10 |
198 | 80 | 65 | 35 | 60 |
95 rows × 4 columns
df.iloc[list(map(lambda x: x>df.att.mean() , df.att))]
df.iloc[map(lambda x: x>df.att.mean() , df.att)]
att | rep | mid | fin | |
---|---|---|---|---|
1 | 95 | 30 | 60 | 10 |
4 | 80 | 60 | 55 | 70 |
8 | 95 | 55 | 65 | 90 |
9 | 90 | 25 | 95 | 50 |
11 | 95 | 60 | 25 | 55 |
... | ... | ... | ... | ... |
184 | 100 | 30 | 30 | 85 |
190 | 95 | 35 | 40 | 95 |
192 | 100 | 40 | 80 | 80 |
197 | 85 | 85 | 100 | 10 |
198 | 80 | 65 | 35 | 60 |
95 rows × 4 columns
df.loc[list(map(lambda x: x>df.att.mean() , df.att))]
df.loc[map(lambda x: x>df.att.mean() , df.att)]
att | rep | mid | fin | |
---|---|---|---|---|
1 | 95 | 30 | 60 | 10 |
4 | 80 | 60 | 55 | 70 |
8 | 95 | 55 | 65 | 90 |
9 | 90 | 25 | 95 | 50 |
11 | 95 | 60 | 25 | 55 |
... | ... | ... | ... | ... |
184 | 100 | 30 | 30 | 85 |
190 | 95 | 35 | 40 | 95 |
192 | 100 | 40 | 80 | 80 |
197 | 85 | 85 | 100 | 10 |
198 | 80 | 65 | 35 | 60 |
95 rows × 4 columns
. |
[] |
.iloc |
.loc |
|
---|---|---|---|---|
row/단일레이블 | X | X | O | O |
col/단일레이블 | O | O | O | O |
row/레이블리스트 | X | X | O | O |
col/레이블리스트 | X | O | O | O |
row/슬라이싱 | X | O | O | O |
col/슬라이싱 | X | X | O | O |
row/bool,list | X | O | O | O |
row/bool,ser | X | O | X | O |
row/bool,map | X | X | O | O |
숙제
1
. 10월12일 숙제
아래와 같이 0~9까지 포함된 리스트를 만들어라
아래와 동일한 기능을 수행하는 함수를 lambda expression으로 정의하라.
map과 lambda expression 을 이용하여 아래와 같은 결과를 만들어라. (리스트컴프리헨션, for문 사용금지)
2
. 10월14일 숙제
다음과 같은 데이터프레임을 불러온 뒤 물음에 답하라
att | rep | mid | fin | |
---|---|---|---|---|
0 | 65 | 45 | 0 | 10 |
1 | 95 | 30 | 60 | 10 |
2 | 65 | 85 | 15 | 20 |
3 | 55 | 35 | 35 | 5 |
4 | 80 | 60 | 55 | 70 |
... | ... | ... | ... | ... |
195 | 55 | 70 | 40 | 95 |
196 | 65 | 85 | 25 | 85 |
197 | 85 | 85 | 100 | 10 |
198 | 80 | 65 | 35 | 60 |
199 | 50 | 95 | 45 | 85 |
200 rows × 4 columns
(1)
기말고사 성적이 중간고사 성적보다 향상된 학생들을 출력하라. 즉 mid < fin 인 학생들을 출력하라. (다양한 방법으로 연습할 것, 제출은 한 가지 방법으로 구현해도 감점없음)
att | rep | mid | fin | |
---|---|---|---|---|
0 | 65 | 45 | 0 | 10 |
2 | 65 | 85 | 15 | 20 |
4 | 80 | 60 | 55 | 70 |
5 | 75 | 40 | 75 | 85 |
6 | 65 | 70 | 60 | 75 |
... | ... | ... | ... | ... |
194 | 65 | 40 | 65 | 70 |
195 | 55 | 70 | 40 | 95 |
196 | 65 | 85 | 25 | 85 |
198 | 80 | 65 | 35 | 60 |
199 | 50 | 95 | 45 | 85 |
93 rows × 4 columns
(2)
기말고사 성적이 중간고사 성적보다 향상된 학생들의 출석과 레포트 점수를 출력하라.