Python - Pandas 기초 (2)

7 분 소요

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

댓글남기기