Arithmetic & Data Alignment
s1 = pd.Series([7.3 , - 2.5 , 3.4 , 1.5 ], index= ["a" , "c" , "d" , "e" ])
s2 = pd.Series([- 2.1 , 3.6 , - 1.5 , 4 , 3.1 ],
index= ["a" , "c" , "e" , "f" , "g" ])
s1
a 7.3
c -2.5
d 3.4
e 1.5
dtype: float64
a -2.1
c 3.6
e -1.5
f 4.0
g 3.1
dtype: float64
s1 + s2 # 시리즈끼리 더하면 하나라도 없는값 NaN
a 5.2
c 1.1
d NaN
e 0.0
f NaN
g NaN
dtype: float64
df1 = pd.DataFrame(np.arange(9. ).reshape((3 , 3 )), columns= list ("bcd" ),
index= ["Ohio" , "Texas" , "Colorado" ])
df2 = pd.DataFrame(np.arange(12. ).reshape((4 , 3 )), columns= list ("bde" ),
index= ["Utah" , "Ohio" , "Texas" , "Oregon" ])
df1
b
c
d
Ohio
0.0
1.0
2.0
Texas
3.0
4.0
5.0
Colorado
6.0
7.0
8.0
b
d
e
Utah
0.0
1.0
2.0
Ohio
3.0
4.0
5.0
Texas
6.0
7.0
8.0
Oregon
9.0
10.0
11.0
df1 + df2 # 없는 행이나 열: NaN
b
c
d
e
Colorado
NaN
NaN
NaN
NaN
Ohio
3.0
NaN
6.0
NaN
Oregon
NaN
NaN
NaN
NaN
Texas
9.0
NaN
12.0
NaN
Utah
NaN
NaN
NaN
NaN
df1 = pd.DataFrame({"A" : [1 , 2 ]})
df2 = pd.DataFrame({"B" : [3 , 4 ]})
df1
df2
df1 = pd.DataFrame(np.arange(12. ).reshape((3 , 4 )),
columns= list ("abcd" ))
df2 = pd.DataFrame(np.arange(20. ).reshape((4 , 5 )),
columns= list ("abcde" ))
df2
a
b
c
d
e
0
0.0
1.0
2.0
3.0
4.0
1
5.0
6.0
7.0
8.0
9.0
2
10.0
11.0
12.0
13.0
14.0
3
15.0
16.0
17.0
18.0
19.0
df2.loc[1 , "b" ] = np.nan
df2
a
b
c
d
e
0
0.0
1.0
2.0
3.0
4.0
1
5.0
NaN
7.0
8.0
9.0
2
10.0
11.0
12.0
13.0
14.0
3
15.0
16.0
17.0
18.0
19.0
a
b
c
d
0
0.0
1.0
2.0
3.0
1
4.0
5.0
6.0
7.0
2
8.0
9.0
10.0
11.0
a
b
c
d
e
0
0.0
2.0
4.0
6.0
NaN
1
9.0
NaN
13.0
15.0
NaN
2
18.0
20.0
22.0
24.0
NaN
3
NaN
NaN
NaN
NaN
NaN
df1.add(df2, fill_value= 0 ) # NaN 값 되는거
a
b
c
d
e
0
0.0
2.0
4.0
6.0
4.0
1
9.0
5.0
13.0
15.0
9.0
2
18.0
20.0
22.0
24.0
14.0
3
15.0
16.0
17.0
18.0
19.0
a
b
c
d
0
0.0
1.0
2.0
3.0
1
4.0
5.0
6.0
7.0
2
8.0
9.0
10.0
11.0
a
b
c
d
0
inf
1.000000
0.500000
0.333333
1
0.250
0.200000
0.166667
0.142857
2
0.125
0.111111
0.100000
0.090909
a
b
c
d
0
inf
1.000000
0.500000
0.333333
1
0.250
0.200000
0.166667
0.142857
2
0.125
0.111111
0.100000
0.090909
df1.reindex(columns= df2.columns, fill_value= 0 ) # 컬럼 추가
a
b
c
d
e
0
0.0
1.0
2.0
3.0
0
1
4.0
5.0
6.0
7.0
0
2
8.0
9.0
10.0
11.0
0
df1.reindex(columns= ['e' ], fill_value= 0 )
arr = np.arange(12. ).reshape((3 , 4 ))
arr
array([[ 0., 1., 2., 3.],
[ 4., 5., 6., 7.],
[ 8., 9., 10., 11.]])
array([0., 1., 2., 3.])
arr - arr[0 ] # 각각의 행값이 계산됨
array([[0., 0., 0., 0.],
[4., 4., 4., 4.],
[8., 8., 8., 8.]])
frame = pd.DataFrame(np.arange(12. ).reshape((4 , 3 )),
columns= list ("bde" ),
index= ["Utah" , "Ohio" , "Texas" , "Oregon" ])
series = frame.iloc[0 ]
series
b 0.0
d 1.0
e 2.0
Name: Utah, dtype: float64
b
d
e
Utah
0.0
1.0
2.0
Ohio
3.0
4.0
5.0
Texas
6.0
7.0
8.0
Oregon
9.0
10.0
11.0
frame - series # 시리즈 값만큼 각각 계산
b
d
e
Utah
0.0
0.0
0.0
Ohio
3.0
3.0
3.0
Texas
6.0
6.0
6.0
Oregon
9.0
9.0
9.0
series2 = pd.Series(np.arange(3 ), index= ["b" , "e" , "f" ])
series2
b 0
e 1
f 2
dtype: int32
b
d
e
f
Utah
0.0
NaN
3.0
NaN
Ohio
3.0
NaN
6.0
NaN
Texas
6.0
NaN
9.0
NaN
Oregon
9.0
NaN
12.0
NaN
series3 = frame["d" ]
series3
Utah 1.0
Ohio 4.0
Texas 7.0
Oregon 10.0
Name: d, dtype: float64
frame.sub(series3, axis= "index" ) # index기준으로 빼기
b
d
e
Utah
-1.0
0.0
1.0
Ohio
-1.0
0.0
1.0
Texas
-1.0
0.0
1.0
Oregon
-1.0
0.0
1.0
frame = pd.DataFrame(np.random.standard_normal((4 , 3 )),
columns= list ("bde" ),
index= ["Utah" , "Ohio" , "Texas" , "Oregon" ])
frame
np.abs (frame)
b
d
e
Utah
0.204708
0.478943
0.519439
Ohio
0.555730
1.965781
1.393406
Texas
0.092908
0.281746
0.769023
Oregon
1.246435
1.007189
1.296221
b
d
e
Utah
-0.204708
0.478943
-0.519439
Ohio
-0.555730
1.965781
1.393406
Texas
0.092908
0.281746
0.769023
Oregon
1.246435
1.007189
-1.296221
def f1(x):
return x.max () - x.min () # 열기준
frame.apply (f1)
b 1.802165
d 1.684034
e 2.689627
dtype: float64
frame.apply (f1, axis= "columns" ) # 각 행에 대해
Utah 0.998382
Ohio 2.521511
Texas 0.676115
Oregon 2.542656
dtype: float64
def f2(x):
return pd.Series([x.min (), x.max ()], index= ["min" , "max" ]) # 시리즈 객체로 최대/최소 값, 인덱스 지정
frame.apply (f2)
b
d
e
min
-0.555730
0.281746
-1.296221
max
1.246435
1.965781
1.393406
def my_format(x):
return f" { x:.2f} " # 소수점 둘째자리 까지 반올림
frame.applymap(my_format)
b
d
e
Utah
-0.20
0.48
-0.52
Ohio
-0.56
1.97
1.39
Texas
0.09
0.28
0.77
Oregon
1.25
1.01
-1.30
frame["e" ].map (my_format) # 소수점 둘째자리 까지 반올림 (map:호출)
Utah -0.52
Ohio 1.39
Texas 0.77
Oregon -1.30
Name: e, dtype: object
obj = pd.Series(np.arange(4 ), index= ["d" , "a" , "b" , "c" ])
obj
d 0
a 1
b 2
c 3
dtype: int32
obj.sort_index() # 인덱스 오름차순
a 1
b 2
c 3
d 0
dtype: int32
frame = pd.DataFrame(np.arange(8 ).reshape((2 , 4 )),
index= ["three" , "one" ],
columns= ["d" , "a" , "b" , "c" ])
frame
d
a
b
c
three
0
1
2
3
one
4
5
6
7
d
a
b
c
one
4
5
6
7
three
0
1
2
3
frame.sort_index(axis= "columns" ) # 컬럼 정렬
a
b
c
d
three
1
2
3
0
one
5
6
7
4
frame.sort_index(axis= "columns" , ascending= False ) # 내림차순
d
c
b
a
three
0
3
2
1
one
4
7
6
5
obj = pd.Series([4 , 7 , - 3 , 2 ])
obj.sort_values() # 시리즈 값들이 오름차순
2 -3
3 2
0 4
1 7
dtype: int64
obj = pd.Series([4 , np.nan, 7 , np.nan, - 3 , 2 ])
obj.sort_values() # NaN은 맨밑
4 -3.0
5 2.0
0 4.0
2 7.0
1 NaN
3 NaN
dtype: float64
obj.sort_values(na_position= "first" ) # NaN이 첫 번째
1 NaN
3 NaN
4 -3.0
5 2.0
0 4.0
2 7.0
dtype: float64
frame = pd.DataFrame({"b" : [4 , 7 , - 3 , 2 ], "a" : [0 , 1 , 0 , 1 ]})
frame
frame.sort_values("b" ) # b만 정렬
b
a
2
-3
0
3
2
1
0
4
0
1
7
1
frame.sort_values(["a" , "b" ])
b
a
2
-3
0
0
4
0
3
2
1
1
7
1
obj = pd.Series([7 , - 5 , 7 , 4 , 2 , 0 , 4 ])
obj
0 7
1 -5
2 7
3 4
4 2
5 0
6 4
dtype: int64
0 6.5
1 1.0
2 6.5
3 4.5
4 3.0
5 2.0
6 4.5
dtype: float64
obj.rank(method= "first" ) # 동일 순위있어도 더 큰 순위 표시
0 6.0
1 1.0
2 7.0
3 4.0
4 3.0
5 2.0
6 5.0
dtype: float64
obj.rank(ascending= False ) # 순위 내림차순
0 1.5
1 7.0
2 1.5
3 3.5
4 5.0
5 6.0
6 3.5
dtype: float64
frame = pd.DataFrame({"b" : [4.3 , 7 , - 3 , 2 ], "a" : [0 , 1 , 0 , 1 ],
"c" : [- 2 , 5 , 8 , - 2.5 ]})
frame
b
a
c
0
4.3
0
-2.0
1
7.0
1
5.0
2
-3.0
0
8.0
3
2.0
1
-2.5
frame.rank(axis= "columns" ) # 행
b
a
c
0
3.0
2.0
1.0
1
3.0
1.0
2.0
2
1.0
2.0
3.0
3
3.0
2.0
1.0
obj = pd.Series(np.arange(5 ), index= ["a" , "a" , "b" , "b" , "c" ])
obj
a 0
a 1
b 2
b 3
c 4
dtype: int32
obj.index.is_unique # 인덱스에 중복값 있으면 False
False
(a 0
a 1
dtype: int32,
4)
df = pd.DataFrame(np.random.standard_normal((5 , 3 )),
index= ["a" , "a" , "b" , "b" , "c" ])
df
0
1
2
a
0.274992
0.228913
1.352917
a
0.886429
-2.001637
-0.371843
b
1.669025
-0.438570
-0.539741
b
0.476985
3.248944
-1.021228
c
-0.577087
0.124121
0.302614
0
1
2
b
1.669025
-0.438570
-0.539741
b
0.476985
3.248944
-1.021228
0 -0.577087
1 0.124121
2 0.302614
Name: c, dtype: float64
df = pd.DataFrame([[1.4 , np.nan], [7.1 , - 4.5 ],
[np.nan, np.nan], [0.75 , - 1.3 ]],
index= ["a" , "b" , "c" , "d" ],
columns= ["one" , "two" ])
df
one
two
a
1.40
NaN
b
7.10
-4.5
c
NaN
NaN
d
0.75
-1.3
one 9.25
two -5.80
dtype: float64
df.sum (axis= "columns" ) #행
a 1.40
b 2.60
c 0.00
d -0.55
dtype: float64
# index : 열
df.sum (axis= "index" , skipna= False ) , df.sum (axis= "columns" , skipna= False ) # 결측값 포함 계산 # 행
(one NaN
two NaN
dtype: float64,
a NaN
b 2.60
c NaN
d -0.55
dtype: float64)
df.mean(axis= "columns" ) # 모두 NaN 이었으면 NaN
a 1.400
b 1.300
c NaN
d -0.275
dtype: float64
df.idxmax() # 각 열에 최대값에 해당하는 행 이름 출력
one b
two d
dtype: object
one
two
a
1.40
NaN
b
8.50
-4.5
c
NaN
NaN
d
9.25
-5.8
one
two
count
3.000000
2.000000
mean
3.083333
-2.900000
std
3.493685
2.262742
min
0.750000
-4.500000
25%
1.075000
-3.700000
50%
1.400000
-2.900000
75%
4.250000
-2.100000
max
7.100000
-1.300000
obj = pd.Series(["a" , "a" , "b" , "c" ] * 4 ) # 4개 값 만들기
obj
0 a
1 a
2 b
3 c
4 a
5 a
6 b
7 c
8 a
9 a
10 b
11 c
12 a
13 a
14 b
15 c
dtype: object
count 16
unique 3
top a
freq 8
dtype: object
price = pd.read_pickle("C:/Users/seong taek/3-1 Python_Hard/yahoo_price.pkl" )
volume = pd.read_pickle("C:/Users/seong taek/3-1 Python_Hard/yahoo_volume.pkl" )
price
AAPL
GOOG
IBM
MSFT
Date
2010-01-04
27.990226
313.062468
113.304536
25.884104
2010-01-05
28.038618
311.683844
111.935822
25.892466
2010-01-06
27.592626
303.826685
111.208683
25.733566
2010-01-07
27.541619
296.753749
110.823732
25.465944
2010-01-08
27.724725
300.709808
111.935822
25.641571
…
…
…
…
…
2016-10-17
117.550003
779.960022
154.770004
57.220001
2016-10-18
117.470001
795.260010
150.720001
57.660000
2016-10-19
117.120003
801.500000
151.259995
57.529999
2016-10-20
117.059998
796.969971
151.520004
57.250000
2016-10-21
116.599998
799.369995
149.630005
59.660000
1714 rows × 4 columns
AAPL
GOOG
IBM
MSFT
Date
2010-01-04
123432400
3927000
6155300
38409100
2010-01-05
150476200
6031900
6841400
49749600
2010-01-06
138040000
7987100
5605300
58182400
2010-01-07
119282800
12876600
5840600
50559700
2010-01-08
111902700
9483900
4197200
51197400
…
…
…
…
…
2016-10-17
23624900
1089500
5890400
23830000
2016-10-18
24553500
1995600
12770600
19149500
2016-10-19
20034600
116600
4632900
22878400
2016-10-20
24125800
1734200
4023100
49455600
2016-10-21
22384800
1260500
4401900
79974200
1714 rows × 4 columns
returns = price.pct_change() # 변화율 추출
returns
AAPL
GOOG
IBM
MSFT
Date
2010-01-04
NaN
NaN
NaN
NaN
2010-01-05
0.001729
-0.004404
-0.012080
0.000323
2010-01-06
-0.015906
-0.025209
-0.006496
-0.006137
2010-01-07
-0.001849
-0.023280
-0.003462
-0.010400
2010-01-08
0.006648
0.013331
0.010035
0.006897
…
…
…
…
…
2016-10-17
-0.000680
0.001837
0.002072
-0.003483
2016-10-18
-0.000681
0.019616
-0.026168
0.007690
2016-10-19
-0.002979
0.007846
0.003583
-0.002255
2016-10-20
-0.000512
-0.005652
0.001719
-0.004867
2016-10-21
-0.003930
0.003011
-0.012474
0.042096
1714 rows × 4 columns
returns["MSFT" ].corr(returns["IBM" ]), returns["MSFT" ].cov(returns["IBM" ]) # 상관관계, 공분산
(0.49976361144151155, 8.870655479703546e-05)
returns.corr(), returns.cov()
( AAPL GOOG IBM MSFT
AAPL 1.000000 0.407919 0.386817 0.389695
GOOG 0.407919 1.000000 0.405099 0.465919
IBM 0.386817 0.405099 1.000000 0.499764
MSFT 0.389695 0.465919 0.499764 1.000000,
AAPL GOOG IBM MSFT
AAPL 0.000277 0.000107 0.000078 0.000095
GOOG 0.000107 0.000251 0.000078 0.000108
IBM 0.000078 0.000078 0.000146 0.000089
MSFT 0.000095 0.000108 0.000089 0.000215)
returns.corrwith(returns["IBM" ]) # 각열과의 상관관계
AAPL 0.386817
GOOG 0.405099
IBM 1.000000
MSFT 0.499764
dtype: float64
AAPL -0.075565
GOOG -0.007067
IBM -0.204849
MSFT -0.092950
dtype: float64
obj = pd.Series(["c" , "a" , "d" , "a" , "a" , "b" , "b" , "c" , "c" ])
obj
0 c
1 a
2 d
3 a
4 a
5 b
6 b
7 c
8 c
dtype: object
uniques = obj.unique()
uniques
array(['c', 'a', 'd', 'b'], dtype=object)
obj.value_counts() # 고유값 개수
c 3
a 3
b 2
d 1
dtype: int64
pd.value_counts(obj.to_numpy(), sort= False ) # 넘파이 배열에서 각 값의 개수
c 3
a 3
d 1
b 2
dtype: int64
obj
mask = obj.isin(["b" , "c" ]) # isin : 찾기
mask
obj[mask]
0 c
5 b
6 b
7 c
8 c
dtype: object
to_match = pd.Series(["c" , "a" , "b" , "b" , "c" , "a" ])
unique_vals = pd.Series(["c" , "b" , "a" ])
indices = pd.Index(unique_vals).get_indexer(to_match)
indices
array([0, 2, 1, 1, 0, 2], dtype=int64)
data = pd.DataFrame({"Qu1" : [1 , 3 , 4 , 3 , 4 ],
"Qu2" : [2 , 3 , 1 , 2 , 3 ],
"Qu3" : [1 , 5 , 2 , 4 , 4 ]})
data
Qu1
Qu2
Qu3
0
1
2
1
1
3
3
5
2
4
1
2
3
3
2
4
4
4
3
4
data["Qu1" ].value_counts().sort_index() # 인덱스 오름차순
1 1
3 2
4 2
Name: Qu1, dtype: int64
result = data.apply (pd.value_counts).fillna(0 ) # 인덱스 : 모든 value값 , value : 개수
result
Qu1
Qu2
Qu3
1
1.0
1.0
1.0
2
0.0
2.0
1.0
3
2.0
2.0
0.0
4
2.0
0.0
2.0
5
0.0
0.0
1.0
data = pd.DataFrame({"a" : [1 , 1 , 1 , 2 , 2 ], "b" : [0 , 0 , 1 , 0 , 0 ]})
data
a
b
0
1
0
1
1
0
2
1
1
3
2
0
4
2
0
data.value_counts() # 행단위로 개수 파악
a b
1 0 2
2 0 2
1 1 1
dtype: int64
pd.options.display.max_rows = PREVIOUS_MAX_ROWS
PREVIOUS_MAX_ROWS
60
df = pd.read_csv("pandas_practice.csv" )
df
이름
발표횟수
0
강동환
0
1
김대천
0
2
김성태
0
3
김수경
0
4
김승일
0
5
김재현
0
6
김주영
0
7
김주향
0
8
김지환
0
9
김진용
0
10
김희수
0
11
노건우
0
12
박동균
0
13
박성빈
0
14
박성수
0
15
박성진
0
16
박정아
0
17
박준규
0
18
서보연
0
19
손현동
0
20
송치민
0
21
신동훈
0
22
신혜람
0
23
양정현
0
24
유병우
0
25
유지의
0
26
유채영
0
27
윤서림
0
28
윤여린
0
29
윤정수
0
30
이강륜
0
31
이민재
0
32
이주영
0
33
이지호
0
34
이현상
0
35
인지영
0
36
임준열
0
37
임채리
0
38
전병훈
0
39
전효원
0
40
정대규
0
41
정서연
0
42
정진아
0
43
정형욱
0
44
조성택
0
45
조준하
0
46
조중석
0
47
조철민
0
48
조효진
0
49
채준기
0
50
최송연
0
51
최원준
0
52
최재혁
0
53
최희승
0
54
홍예린
0
랜덤 학생 뽑기
def pop_student(df= df):
length = df.shape[0 ]
rand_num = np.random.randint(0 ,length)
name = df.iloc[rand_num]["이름" ]
print (f"축하합니다! { name} 학생이 당첨되었습니다" )
pop_student(df)
축하합니다! 정서연 학생이 당첨되었습니다
위의 df에서 학생의 성을 “성”이라는 컬럼에 매핑해 봅시다
df["성" ] = df.apply (lambda x: x["이름" ][0 ], axis= 1 )
df
이름
발표횟수
성
0
강동환
0
강
1
김대천
0
김
2
김성태
0
김
3
김수경
0
김
4
김승일
0
김
5
김재현
0
김
6
김주영
0
김
7
김주향
0
김
8
김지환
0
김
9
김진용
0
김
10
김희수
0
김
11
노건우
0
노
12
박동균
0
박
13
박성빈
0
박
14
박성수
0
박
15
박성진
0
박
16
박정아
0
박
17
박준규
0
박
18
서보연
0
서
19
손현동
0
손
20
송치민
0
송
21
신동훈
0
신
22
신혜람
0
신
23
양정현
0
양
24
유병우
0
유
25
유지의
0
유
26
유채영
0
유
27
윤서림
0
윤
28
윤여린
0
윤
29
윤정수
0
윤
30
이강륜
0
이
31
이민재
0
이
32
이주영
0
이
33
이지호
0
이
34
이현상
0
이
35
인지영
0
인
36
임준열
0
임
37
임채리
0
임
38
전병훈
0
전
39
전효원
0
전
40
정대규
0
정
41
정서연
0
정
42
정진아
0
정
43
정형욱
0
정
44
조성택
0
조
45
조준하
0
조
46
조중석
0
조
47
조철민
0
조
48
조효진
0
조
49
채준기
0
채
50
최송연
0
최
51
최원준
0
최
52
최재혁
0
최
53
최희승
0
최
54
홍예린
0
홍
df["성" ].unique().shape # 20개의 서로 다른 성씨
(20,)
김 10
박 6
조 5
이 5
최 4
정 4
윤 3
유 3
임 2
신 2
전 2
채 1
강 1
인 1
양 1
송 1
손 1
서 1
노 1
홍 1
Name: 성, dtype: int64
이름
발표횟수
성
44
조성택
0
조
45
조준하
0
조
46
조중석
0
조
47
조철민
0
조
48
조효진
0
조
df.loc[df["성" ]== "조" ,"이름" ] # 조씨인 '이름' 정보만 추출
44 조성택
45 조준하
46 조중석
47 조철민
48 조효진
Name: 이름, dtype: object
55
결석한 학생들은 빼고 학생을 출력되도록 업데이트 해봅시다
absence = ["조성택" , "최원준" , "정대규" , "이강륜" , "노건우" , "김재현" , "윤여린" ,
"김희수" , "최송연" ]
def pop_student_update(df= df, absence= absence):
df_present = df[~ df['이름' ].isin(absence)].reset_index(drop= True )
length = df_present.shape[0 ]
rand_num = np.random.randint(0 , length)
name = df_present.iloc[rand_num]["이름" ]
print (f"축하합니다! { name} 학생이 당첨되었습니다" )
pop_student_update(df)
축하합니다! 신동훈 학생이 당첨되었습니다
df.loc[~ df["이름" ].isin(absence)] # absence 제외 이름 추출
이름
발표횟수
성
0
강동환
0
강
1
김대천
0
김
2
김성태
0
김
3
김수경
0
김
4
김승일
0
김
6
김주영
0
김
7
김주향
0
김
8
김지환
0
김
9
김진용
0
김
12
박동균
0
박
13
박성빈
0
박
14
박성수
0
박
15
박성진
0
박
16
박정아
0
박
17
박준규
0
박
18
서보연
0
서
19
손현동
0
손
20
송치민
0
송
21
신동훈
0
신
22
신혜람
0
신
23
양정현
0
양
24
유병우
0
유
25
유지의
0
유
26
유채영
0
유
27
윤서림
0
윤
29
윤정수
0
윤
31
이민재
0
이
32
이주영
0
이
33
이지호
0
이
34
이현상
0
이
35
인지영
0
인
36
임준열
0
임
37
임채리
0
임
38
전병훈
0
전
39
전효원
0
전
41
정서연
0
정
42
정진아
0
정
43
정형욱
0
정
45
조준하
0
조
46
조중석
0
조
47
조철민
0
조
48
조효진
0
조
49
채준기
0
채
52
최재혁
0
최
53
최희승
0
최
54
홍예린
0
홍
뽑힌 학생들에 대해, 발표횟수를 업데이트 할 수 있도록 코드를 고쳐봅시다
df.loc[df['이름' ]== '조성택' ]['발표횟수' ] # 발표횟수 추출
44 0
Name: 발표횟수, dtype: int64
df.loc[df['이름' ]== '조성택' ,'발표횟수' ] += 1 # 발표횟수 1 늘리기
df
이름
발표횟수
성
0
강동환
0
강
1
김대천
0
김
2
김성태
0
김
3
김수경
0
김
4
김승일
0
김
5
김재현
0
김
6
김주영
0
김
7
김주향
0
김
8
김지환
0
김
9
김진용
0
김
10
김희수
0
김
11
노건우
0
노
12
박동균
0
박
13
박성빈
0
박
14
박성수
0
박
15
박성진
0
박
16
박정아
0
박
17
박준규
0
박
18
서보연
0
서
19
손현동
0
손
20
송치민
0
송
21
신동훈
0
신
22
신혜람
0
신
23
양정현
0
양
24
유병우
0
유
25
유지의
0
유
26
유채영
0
유
27
윤서림
0
윤
28
윤여린
0
윤
29
윤정수
0
윤
30
이강륜
0
이
31
이민재
0
이
32
이주영
0
이
33
이지호
0
이
34
이현상
0
이
35
인지영
0
인
36
임준열
0
임
37
임채리
0
임
38
전병훈
0
전
39
전효원
0
전
40
정대규
0
정
41
정서연
0
정
42
정진아
0
정
43
정형욱
0
정
44
조성택
1
조
45
조준하
0
조
46
조중석
0
조
47
조철민
0
조
48
조효진
0
조
49
채준기
0
채
50
최송연
0
최
51
최원준
0
최
52
최재혁
0
최
53
최희승
0
최
54
홍예린
0
홍
df.iloc[np.random.randint(0 ,55 )] # 0~55행 중 랜덤으로 행 추출
이름 최송연
발표횟수 0
성 최
Name: 50, dtype: object
frame = pd.DataFrame(np.random.standard_normal((4 ,3 )),
columns= list ("bde" ),
index= ["Utah" , "Ohio" , "Texas" , "Oregon" ])
frame
b
d
e
Utah
0.523772
-0.144327
1.910040
Ohio
1.808867
-1.105941
0.344533
Texas
1.553014
0.547801
0.256437
Oregon
-1.512917
-0.878108
-0.017276
series2 = pd.Series(np.arange(3 ), index= ["b" , "e" , "f" ])
series2
b 0
e 1
f 2
dtype: int32
frame + series2 # d는 frame에 밖에 없어서 NaN, f는 series 밖에 없어서 NaN
b
d
e
f
Utah
0.523772
NaN
2.910040
NaN
Ohio
1.808867
NaN
1.344533
NaN
Texas
1.553014
NaN
1.256437
NaN
Oregon
-1.512917
NaN
0.982724
NaN
series3 = frame["d" ] # d열 정보 추출
series3
Utah -0.144327
Ohio -1.105941
Texas 0.547801
Oregon -0.878108
Name: d, dtype: float64
frame.loc[:,"d" ] # d열 정보 추출
Utah -0.144327
Ohio -1.105941
Texas 0.547801
Oregon -0.878108
Name: d, dtype: float64
frame.sub(series3, axis= "index" ) # 인덱스 기준으로 d값 제거
b
d
e
Utah
0.668099
0.0
2.054368
Ohio
2.914808
0.0
1.450473
Texas
1.005214
0.0
-0.291364
Oregon
-0.634809
0.0
0.860832
frame - series3 # series값이 부여된 열 없이 값만 있기 때문에 NaN
Ohio
Oregon
Texas
Utah
b
d
e
Utah
NaN
NaN
NaN
NaN
NaN
NaN
NaN
Ohio
NaN
NaN
NaN
NaN
NaN
NaN
NaN
Texas
NaN
NaN
NaN
NaN
NaN
NaN
NaN
Oregon
NaN
NaN
NaN
NaN
NaN
NaN
NaN
col_d = frame["d" ]
df_d = pd.DataFrame(col_d)
df_d
d
Utah
-0.144327
Ohio
-1.105941
Texas
0.547801
Oregon
-0.878108
frame - df_d # d열만 제거 되고 나머지 NaN
b
d
e
Utah
NaN
0.0
NaN
Ohio
NaN
0.0
NaN
Texas
NaN
0.0
NaN
Oregon
NaN
0.0
NaN
b
d
e
Utah
NaN
0.0
NaN
Ohio
NaN
0.0
NaN
Texas
NaN
0.0
NaN
Oregon
NaN
0.0
NaN
b
d
e
Utah
0.523772
-0.144327
1.910040
Ohio
1.808867
-1.105941
0.344533
Texas
1.553014
0.547801
0.256437
Oregon
-1.512917
-0.878108
-0.017276
def f1(x):
return x.max () - x.min () # 최대 - 최소 함수 생성, 열 기준
frame.apply (f1) # axis = 0
b 3.321785
d 1.653742
e 1.927316
dtype: float64
b
d
e
Utah
0.523772
0.144327
1.910040
Ohio
1.808867
1.105941
0.344533
Texas
1.553014
0.547801
0.256437
Oregon
1.512917
0.878108
0.017276
Utah 0.523772
Ohio 1.808867
Texas 1.553014
Oregon -1.512917
Name: b, dtype: float64
3.3217845711306135
함수보다 더 간단한 lambda
frame.apply (lambda x: x.max ()- x.min (), axis= 0 )
b 3.321785
d 1.653742
e 1.927316
dtype: float64
frame.apply (f1, axis= "columns" ) # 행 기준
Utah 2.054368
Ohio 2.914808
Texas 1.296577
Oregon 1.495641
dtype: float64
def f2(x):
return pd.Series([x.min (),x.max ()], index= ["min" , "max" ])
frame.apply (f2)
b
d
e
min
-1.512917
-1.105941
-0.017276
max
1.808867
0.547801
1.910040
frame[["min" , "max" ]] = frame.apply (f2, axis= 1 ) # 새로운 인덱스로 만들기
frame
b
d
e
min
max
Utah
0.523772
-0.144327
1.910040
-0.144327
1.910040
Ohio
1.808867
-1.105941
0.344533
-1.105941
1.808867
Texas
1.553014
0.547801
0.256437
0.256437
1.553014
Oregon
-1.512917
-0.878108
-0.017276
-1.512917
-0.017276
def my_format(x):
return f" { x:.2f} "
frame.applymap(my_format) # 소수점 둘째까지 반올림
b
d
e
min
max
Utah
0.52
-0.14
1.91
-0.14
1.91
Ohio
1.81
-1.11
0.34
-1.11
1.81
Texas
1.55
0.55
0.26
0.26
1.55
Oregon
-1.51
-0.88
-0.02
-1.51
-0.02
Utah 1.910040
Ohio 0.344533
Texas 0.256437
Oregon -0.017276
Name: e, dtype: float64
obj = pd.Series(np.arange(4 ), index= ["d" ,"a" ,"b" ,"c" ])
obj
d 0
a 1
b 2
c 3
dtype: int32
a 1
b 2
c 3
d 0
dtype: int32
frame = pd.DataFrame(np.arange(8 ).reshape((2 ,4 )),
index= ["three" , "one" ],
columns= ["d" , "a" , "b" ,"c" ])
frame
d
a
b
c
three
0
1
2
3
one
4
5
6
7
d
a
b
c
one
4
5
6
7
three
0
1
2
3
frame = pd.DataFrame({"b" : [4.3 , 7 , - 3 , 2 ], "a" : [0 ,1 ,0 ,1 ],
"c" : [- 2 ,5 ,8 ,- 2.5 ]})
frame
b
a
c
0
4.3
0
-2.0
1
7.0
1
5.0
2
-3.0
0
8.0
3
2.0
1
-2.5
(4, 3)
frame.rank(axis= "columns" ) # 행기준 순위
b
a
c
0
3.0
2.0
1.0
1
3.0
1.0
2.0
2
1.0
2.0
3.0
3
3.0
2.0
1.0
frame.rank(axis= "index" ) # 열기준, 중복값은 순위의 평균으로 매김
b
a
c
0
3.0
1.5
2.0
1
4.0
3.5
3.0
2
1.0
1.5
4.0
3
2.0
3.5
1.0
0 False
1 False
2 False
3 False
4 False
5 False
6 False
7 False
8 False
9 False
10 False
11 False
12 False
13 False
14 False
15 False
16 False
17 False
18 False
19 False
20 False
21 False
22 False
23 False
24 False
25 False
26 False
27 False
28 False
29 False
30 False
31 False
32 False
33 False
34 False
35 False
36 False
37 False
38 False
39 False
40 False
41 False
42 False
43 False
44 True
45 False
46 False
47 False
48 False
49 False
50 False
51 False
52 False
53 False
54 False
Name: 이름, dtype: bool