Python - Pandas 기초 (2)
5. 요소 추출
- head(n): 위에서 n줄 추출
- tail(n): 아래에서 n줄 추출
d = np.arange(100).reshape(10,10)
d2 = pd.DataFrame(d)
d2
0 | 1 | 2 | 3 | 4 | 5 | 6 | 7 | 8 | 9 | |
---|---|---|---|---|---|---|---|---|---|---|
0 | 0 | 1 | 2 | 3 | 4 | 5 | 6 | 7 | 8 | 9 |
1 | 10 | 11 | 12 | 13 | 14 | 15 | 16 | 17 | 18 | 19 |
2 | 20 | 21 | 22 | 23 | 24 | 25 | 26 | 27 | 28 | 29 |
3 | 30 | 31 | 32 | 33 | 34 | 35 | 36 | 37 | 38 | 39 |
4 | 40 | 41 | 42 | 43 | 44 | 45 | 46 | 47 | 48 | 49 |
5 | 50 | 51 | 52 | 53 | 54 | 55 | 56 | 57 | 58 | 59 |
6 | 60 | 61 | 62 | 63 | 64 | 65 | 66 | 67 | 68 | 69 |
7 | 70 | 71 | 72 | 73 | 74 | 75 | 76 | 77 | 78 | 79 |
8 | 80 | 81 | 82 | 83 | 84 | 85 | 86 | 87 | 88 | 89 |
9 | 90 | 91 | 92 | 93 | 94 | 95 | 96 | 97 | 98 | 99 |
d2.head()#기본이 5줄
0 | 1 | 2 | 3 | 4 | 5 | 6 | 7 | 8 | 9 | |
---|---|---|---|---|---|---|---|---|---|---|
0 | 0 | 1 | 2 | 3 | 4 | 5 | 6 | 7 | 8 | 9 |
1 | 10 | 11 | 12 | 13 | 14 | 15 | 16 | 17 | 18 | 19 |
2 | 20 | 21 | 22 | 23 | 24 | 25 | 26 | 27 | 28 | 29 |
3 | 30 | 31 | 32 | 33 | 34 | 35 | 36 | 37 | 38 | 39 |
4 | 40 | 41 | 42 | 43 | 44 | 45 | 46 | 47 | 48 | 49 |
d2.head(3)
0 | 1 | 2 | 3 | 4 | 5 | 6 | 7 | 8 | 9 | |
---|---|---|---|---|---|---|---|---|---|---|
0 | 0 | 1 | 2 | 3 | 4 | 5 | 6 | 7 | 8 | 9 |
1 | 10 | 11 | 12 | 13 | 14 | 15 | 16 | 17 | 18 | 19 |
2 | 20 | 21 | 22 | 23 | 24 | 25 | 26 | 27 | 28 | 29 |
d2.tail()
0 | 1 | 2 | 3 | 4 | 5 | 6 | 7 | 8 | 9 | |
---|---|---|---|---|---|---|---|---|---|---|
5 | 50 | 51 | 52 | 53 | 54 | 55 | 56 | 57 | 58 | 59 |
6 | 60 | 61 | 62 | 63 | 64 | 65 | 66 | 67 | 68 | 69 |
7 | 70 | 71 | 72 | 73 | 74 | 75 | 76 | 77 | 78 | 79 |
8 | 80 | 81 | 82 | 83 | 84 | 85 | 86 | 87 | 88 | 89 |
9 | 90 | 91 | 92 | 93 | 94 | 95 | 96 | 97 | 98 | 99 |
d2.tail(3)
0 | 1 | 2 | 3 | 4 | 5 | 6 | 7 | 8 | 9 | |
---|---|---|---|---|---|---|---|---|---|---|
7 | 70 | 71 | 72 | 73 | 74 | 75 | 76 | 77 | 78 | 79 |
8 | 80 | 81 | 82 | 83 | 84 | 85 | 86 | 87 | 88 | 89 |
9 | 90 | 91 | 92 | 93 | 94 | 95 | 96 | 97 | 98 | 99 |
d2[2:5]#인덱스 범위 지정 추출
0 | 1 | 2 | 3 | 4 | 5 | 6 | 7 | 8 | 9 | |
---|---|---|---|---|---|---|---|---|---|---|
2 | 20 | 21 | 22 | 23 | 24 | 25 | 26 | 27 | 28 | 29 |
3 | 30 | 31 | 32 | 33 | 34 | 35 | 36 | 37 | 38 | 39 |
4 | 40 | 41 | 42 | 43 | 44 | 45 | 46 | 47 | 48 | 49 |
d2.loc[3]#인덱스 이름으로 한 줄 추출
0 30
1 31
2 32
3 33
4 34
5 35
6 36
7 37
8 38
9 39
Name: 3, dtype: int32
s = ['a','b','c','d','e','f','g','h','i','j']
s2 = ['c_a','c_b','c_c','c_d','c_e','c_f','c_g','c_h','c_i','c_j']
d3 = pd.DataFrame(d, index=s, columns=s2)
d3
c_a | c_b | c_c | c_d | c_e | c_f | c_g | c_h | c_i | c_j | |
---|---|---|---|---|---|---|---|---|---|---|
a | 0 | 1 | 2 | 3 | 4 | 5 | 6 | 7 | 8 | 9 |
b | 10 | 11 | 12 | 13 | 14 | 15 | 16 | 17 | 18 | 19 |
c | 20 | 21 | 22 | 23 | 24 | 25 | 26 | 27 | 28 | 29 |
d | 30 | 31 | 32 | 33 | 34 | 35 | 36 | 37 | 38 | 39 |
e | 40 | 41 | 42 | 43 | 44 | 45 | 46 | 47 | 48 | 49 |
f | 50 | 51 | 52 | 53 | 54 | 55 | 56 | 57 | 58 | 59 |
g | 60 | 61 | 62 | 63 | 64 | 65 | 66 | 67 | 68 | 69 |
h | 70 | 71 | 72 | 73 | 74 | 75 | 76 | 77 | 78 | 79 |
i | 80 | 81 | 82 | 83 | 84 | 85 | 86 | 87 | 88 | 89 |
j | 90 | 91 | 92 | 93 | 94 | 95 | 96 | 97 | 98 | 99 |
d3.loc['c':'h']
c_a | c_b | c_c | c_d | c_e | c_f | c_g | c_h | c_i | c_j | |
---|---|---|---|---|---|---|---|---|---|---|
c | 20 | 21 | 22 | 23 | 24 | 25 | 26 | 27 | 28 | 29 |
d | 30 | 31 | 32 | 33 | 34 | 35 | 36 | 37 | 38 | 39 |
e | 40 | 41 | 42 | 43 | 44 | 45 | 46 | 47 | 48 | 49 |
f | 50 | 51 | 52 | 53 | 54 | 55 | 56 | 57 | 58 | 59 |
g | 60 | 61 | 62 | 63 | 64 | 65 | 66 | 67 | 68 | 69 |
h | 70 | 71 | 72 | 73 | 74 | 75 | 76 | 77 | 78 | 79 |
d3['c_b']
a 1
b 11
c 21
d 31
e 41
f 51
g 61
h 71
i 81
j 91
Name: c_b, dtype: int32
d3['c_b']['c':'f']
c 21
d 31
e 41
f 51
Name: c_b, dtype: int32
d3.loc['e']['c_e'] #[인덱스][컬럼명]:요소 한개 추출
44
d3.loc['e','c_e']
44
d3['c_e']['e'] #[열명][인덱스명]
44
d3['c_e'][1] #인덱스는 위치값으로 표현 가능
14
d3['c_e'].loc['f']
54
d3.T #전치: 행렬을 뒤집음
a | b | c | d | e | f | g | h | i | j | |
---|---|---|---|---|---|---|---|---|---|---|
c_a | 0 | 10 | 20 | 30 | 40 | 50 | 60 | 70 | 80 | 90 |
c_b | 1 | 11 | 21 | 31 | 41 | 51 | 61 | 71 | 81 | 91 |
c_c | 2 | 12 | 22 | 32 | 42 | 52 | 62 | 72 | 82 | 92 |
c_d | 3 | 13 | 23 | 33 | 43 | 53 | 63 | 73 | 83 | 93 |
c_e | 4 | 14 | 24 | 34 | 44 | 54 | 64 | 74 | 84 | 94 |
c_f | 5 | 15 | 25 | 35 | 45 | 55 | 65 | 75 | 85 | 95 |
c_g | 6 | 16 | 26 | 36 | 46 | 56 | 66 | 76 | 86 | 96 |
c_h | 7 | 17 | 27 | 37 | 47 | 57 | 67 | 77 | 87 | 97 |
c_i | 8 | 18 | 28 | 38 | 48 | 58 | 68 | 78 | 88 | 98 |
c_j | 9 | 19 | 29 | 39 | 49 | 59 | 69 | 79 | 89 | 99 |
6. 데이터 통합
- append(): 세로로 통합
- join(): 가로로 통합
- merge(): 특정 열을 기준으로 가로로 통합
d1 = pd.DataFrame({'A':[78,67,54,34], 'B':[87,67,65,34]})
d2 = pd.DataFrame({'A':[76,54], 'B':[87,56]})
print(d1)
print(d2)
d1.append(d2) #d1에 d2를 붙임, 인덱스는 기존대로 유지
A B
0 78 87
1 67 67
2 54 65
3 34 34
A B
0 76 87
1 54 56
A | B | |
---|---|---|
0 | 78 | 87 |
1 | 67 | 67 |
2 | 54 | 65 |
3 | 34 | 34 |
0 | 76 | 87 |
1 | 54 | 56 |
d1.append(d2, ignore_index=True) #인덱스를 새로 정의하여 붙임
A | B | |
---|---|---|
0 | 78 | 87 |
1 | 67 | 67 |
2 | 54 | 65 |
3 | 34 | 34 |
4 | 76 | 87 |
5 | 54 | 56 |
d3 = pd.DataFrame({'C':[65,43,32]})
d3
C | |
---|---|
0 | 65 |
1 | 43 |
2 | 32 |
d1.join(d3) #열을 새로 추가하여 합침 (같은 이름의 컬럼이 있을 경우 에러 발생)
A | B | C | |
---|---|---|---|
0 | 78 | 87 | 65.0 |
1 | 67 | 67 | 43.0 |
2 | 54 | 65 | 32.0 |
3 | 34 | 34 | NaN |
d1 = pd.DataFrame({'판매월':['1월','2월','3월','4월'], 'A':[54,65,76,78], 'B':[87,65,54,43]})
d1
판매월 | A | B | |
---|---|---|---|
0 | 1월 | 54 | 87 |
1 | 2월 | 65 | 65 |
2 | 3월 | 76 | 54 |
3 | 4월 | 78 | 43 |
d2 = pd.DataFrame({'판매월':['1월','2월','3월','4월'], 'C':[54,43,32,54], 'D':[98,87,76,45]})
d2
판매월 | C | D | |
---|---|---|---|
0 | 1월 | 54 | 98 |
1 | 2월 | 43 | 87 |
2 | 3월 | 32 | 76 |
3 | 4월 | 54 | 45 |
d1.merge(d2) #중복되는 컬럼을 기준으로 열을 추가하여 합침
판매월 | A | B | C | D | |
---|---|---|---|---|---|
0 | 1월 | 54 | 87 | 54 | 98 |
1 | 2월 | 65 | 65 | 43 | 87 |
2 | 3월 | 76 | 54 | 32 | 76 |
3 | 4월 | 78 | 43 | 54 | 45 |
*merge()함수 how옵션
- left: 왼쪽을 모두 선택. 오른쪽은 지정된 열만
- right: 오른쪽 모두 선택. 왼쪽은 지정된 열만
- outer: 왼쪽, 오른쪽 모두 다
- inner: 지정된 열의 공통된 값만
d2 = pd.DataFrame({'판매월':['3월','4월','5월', '6월'], 'C':[54,43,32,54], 'D':[98,87,76,45]})
d2
판매월 | C | D | |
---|---|---|---|
0 | 3월 | 54 | 98 |
1 | 4월 | 43 | 87 |
2 | 5월 | 32 | 76 |
3 | 6월 | 54 | 45 |
d1.merge(d2)#how 기본 값: inner
판매월 | A | B | C | D | |
---|---|---|---|---|---|
0 | 3월 | 76 | 54 | 54 | 98 |
1 | 4월 | 78 | 43 | 43 | 87 |
d1.merge(d2, how='left') #d1의 값들을 기준으로 모두 둔 채로 d2를 합침 (left outer join)
판매월 | A | B | C | D | |
---|---|---|---|---|---|
0 | 1월 | 54 | 87 | NaN | NaN |
1 | 2월 | 65 | 65 | NaN | NaN |
2 | 3월 | 76 | 54 | 54.0 | 98.0 |
3 | 4월 | 78 | 43 | 43.0 | 87.0 |
d1.merge(d2, how='right') #d2의 값들을 기준으로 모두 둔 채로 d1을 합침 (right outer join)
판매월 | A | B | C | D | |
---|---|---|---|---|---|
0 | 3월 | 76.0 | 54.0 | 54 | 98 |
1 | 4월 | 78.0 | 43.0 | 43 | 87 |
2 | 5월 | NaN | NaN | 32 | 76 |
3 | 6월 | NaN | NaN | 54 | 45 |
d1.merge(d2, how='outer')
판매월 | A | B | C | D | |
---|---|---|---|---|---|
0 | 1월 | 54.0 | 87.0 | NaN | NaN |
1 | 2월 | 65.0 | 65.0 | NaN | NaN |
2 | 3월 | 76.0 | 54.0 | 54.0 | 98.0 |
3 | 4월 | 78.0 | 43.0 | 43.0 | 87.0 |
4 | 5월 | NaN | NaN | 32.0 | 76.0 |
5 | 6월 | NaN | NaN | 54.0 | 45.0 |
7. 파일 입출력
read_csv(파일명): csv 파일에서 읽기
DataFrame.to_csv(파일명): 데이터 프레임 내용을 파일에 작성
파일 작성
%%writefile a.csv
이름,국어,영어,수학
aaa,43,54,65
bbb,7,67,87
ccc,54,65,76
Overwriting a.csv
pd.read_csv('a.csv')
이름 | 국어 | 영어 | 수학 | |
---|---|---|---|---|
0 | aaa | 43 | 54 | 65 |
1 | bbb | 7 | 67 | 87 |
2 | ccc | 54 | 65 | 76 |
pd.read_csv('a.csv', index_col='이름') #인덱스 칼럼을 지정하여 데이터프레임 생성
국어 | 영어 | 수학 | |
---|---|---|---|
이름 | |||
aaa | 43 | 54 | 65 |
bbb | 7 | 67 | 87 |
ccc | 54 | 65 | 76 |
d1.to_csv('b.csv') #d1 데이터프레임을 b.csv로 쓰도록 함
pd.read_csv('b.csv', index_col='Unnamed: 0')
판매월 | A | B | |
---|---|---|---|
0 | 1월 | 54 | 87 |
1 | 2월 | 65 | 65 |
2 | 3월 | 76 | 54 |
3 | 4월 | 78 | 43 |
l = np.array([[1,'aaa', 34,45,56],[2,'bbb', 34,56,76]])
l
array([['1', 'aaa', '34', '45', '56'],
['2', 'bbb', '34', '56', '76']], dtype='<U11')
x = np.array(l[:,2:], dtype=np.int32)
x
array([[34, 45, 56],
[34, 56, 76]])
data = pd.read_csv('도로교통공단_최근5년_교통사고_통계.CSV', encoding='euc-kr')
data
발생년 | 사고건수 | 사망자수 | 중상자수 | 경상자수 | 부상신고자수 | |
---|---|---|---|---|---|---|
0 | 2015 | 232035 | 4621 | 92522 | 233646 | 24232 |
1 | 2016 | 220917 | 4292 | 82463 | 226283 | 22974 |
2 | 2017 | 216335 | 4185 | 78212 | 223200 | 21417 |
3 | 2018 | 217148 | 3781 | 74258 | 227511 | 21268 |
4 | 2019 | 229600 | 3349 | 72306 | 245524 | 23882 |
data.describe()
발생년 | 사고건수 | 사망자수 | 중상자수 | 경상자수 | 부상신고자수 | |
---|---|---|---|---|---|---|
count | 5.000000 | 5.000000 | 5.000000 | 5.000000 | 5.000000 | 5.000000 |
mean | 2017.000000 | 223207.000000 | 4045.600000 | 79952.200000 | 231232.800000 | 22754.600000 |
std | 1.581139 | 7210.825161 | 491.552439 | 8034.621534 | 8845.056851 | 1369.400526 |
min | 2015.000000 | 216335.000000 | 3349.000000 | 72306.000000 | 223200.000000 | 21268.000000 |
25% | 2016.000000 | 217148.000000 | 3781.000000 | 74258.000000 | 226283.000000 | 21417.000000 |
50% | 2017.000000 | 220917.000000 | 4185.000000 | 78212.000000 | 227511.000000 | 22974.000000 |
75% | 2018.000000 | 229600.000000 | 4292.000000 | 82463.000000 | 233646.000000 | 23882.000000 |
max | 2019.000000 | 232035.000000 | 4621.000000 | 92522.000000 | 245524.000000 | 24232.000000 |
댓글남기기