import pandas as pd
list = [9904312, 3448737, 2890451, 266052]
city = ['서울', '부산', '인천', '대구']
population = pd.Series(list, index = city)
population
서울 9904312
부산 3448737
인천 2890451
대구 266052
dtype: int64
population.values
array([9904312, 3448737, 2890451, 266052], dtype=int64)
population.index
Index(['서울', '부산', '인천', '대구'], dtype='object')
population.dtype
dtype('int64')
population
population.index.name = '도시'
population
도시
서울 9904312
부산 3448737
인천 2890451
대구 266052
dtype: int64
population/1000000
도시
서울 9.904312
부산 3.448737
인천 2.890451
대구 0.266052
dtype: float64
population>=1000000
도시
서울 True
부산 True
인천 True
대구 False
dtype: bool
Series 인덱싱
population[0], population['서울']
(9904312, 9904312)
population
도시
서울 9904312
부산 3448737
인천 2890451
대구 266052
dtype: int64
#여러개 요소 인덱싱
population[[0,3,1]]
도시
서울 9904312
대구 266052
부산 3448737
dtype: int64
population[['서울','대구','부산']]
도시
서울 9904312
대구 266052
부산 3448737
dtype: int64
bol=population >=2500000
print(population[bol])
도시
서울 9904312
부산 3448737
인천 2890451
dtype: int64
bol1 = population >= 2500000
bol2 = population <= 5000000
population[bol]
도시
서울 9904312
부산 3448737
인천 2890451
dtype: int64
bol1 & bol2
도시
서울 False
부산 True
인천 True
대구 False
dtype: bool
population[bol1 & bol2]
도시
부산 3448737
인천 2890451
dtype: int64
population[1:3] #순서번호
도시
부산 3448737
인천 2890451
dtype: int64
population["부산":"대구"]
도시
부산 3448737
인천 2890451
대구 266052
dtype: int64
population['부산':'대구']
도시
부산 3448737
인천 2890451
대구 266052
dtype: int64
data = {"아구몬":9631482, "피요몬":3393197, "텐타몬":1490158, "가트몬":2632035}
digimon = pd.Series(data)
digimon
아구몬 9631482
피요몬 3393197
텐타몬 1490158
가트몬 2632035
dtype: int64
digimon.index
Index(['아구몬', '피요몬', '텐타몬', '가트몬'], dtype='object')
data2 = {"아구몬":9904312, "피요몬":3448737, "텐타몬":2466052, "니드몬":2890451}
digimon_levelup = pd.Series(data2)
digimon_levelup
아구몬 9904312
피요몬 3448737
텐타몬 2466052
니드몬 2890451
dtype: int64
attack = digimon_levelup - digimon #시리즈와 시리즈 연산 같은 인덱스를 가진 Value끼리 연산을 진행
bol = attack.notnull()
#notnull 비어있는 값(결측지)이면 False 그외 True
attack[bol]
아구몬 272830.0
텐타몬 975894.0
피요몬 55540.0
dtype: float64
#비어있는 데이터 확인
bol2 = attack.isnull()
attack[bol2]
가트몬 NaN
니드몬 NaN
dtype: float64
rp = (digimon_levelup - digimon)/digimon * 100
rp[rp.notnull()]
아구몬 2.832690
텐타몬 65.489297
피요몬 1.636804
dtype: float64
rp['아구몬'] = 1.6
rp['파닥몬'] = 5.5
# del rp['피요몬']
rp
가트몬 NaN
니드몬 NaN
아구몬 1.600000
텐타몬 65.489297
피요몬 1.636804
파닥몬 5.500000
dtype: float64
data = {"2015":[9904312,3448737,2894051,2466052],
"2010":[9631482,3393191,2632035,2431774]}
df = pd.DataFrame(data) #data, index = ""가능
df
2015 2010
0 9904312 9631482
1 3448737 3393191
2 2894051 2632035
3 2466052 2431774
df.index = ['서울', '부산', '인천', '대구']
df
2015 2010
서울 9904312 9631482
부산 3448737 3393191
인천 2894051 2632035
대구 2466052 2431774
list1 = [[9904312,3448737,2894051,2466052],
[9631482,3393191,2632035,2431774]]
list1
df2 = pd.DataFrame(list1, index=["2015","2010"], columns = ["서울", "부산", "인천","대구"])
df2
서울 부산 인천 대구
2015 9904312 3448737 2894051 2466052
2010 9631482 3393191 2632035 2431774
#데이터프레임.T : 전치(행과 열을 뒤집어줌)
df2.T
2015 2010
서울 9904312 9631482
부산 3448737 3393191
인천 2894051 2632035
대구 2466052 2431774
df.values
array([[9904312, 9631482],
[3448737, 3393191],
[2894051, 2632035],
[2466052, 2431774]], dtype=int64)
# dtype = object ->문자열
df.index
Index(['서울', '부산', '인천', '대구'], dtype='object')
df.columns
Index(['2015', '2010'], dtype='object')
#데이터프레임 [컬럼이름]
df["2015"]
df[['2015', '2010']]
2015 2010
서울 9904312 9631482
부산 3448737 3393191
인천 2894051 2632035
대구 2466052 2431774
df['2005'] = [9762546,3512547,2517680,2456016]
df
2015 2010 2005
서울 9904312 9631482 9762546
부산 3448737 3393191 3512547
인천 2894051 2632035 2517680
대구 2466052 2431774 2456016
#기본 인덱싱 [] 방법 -> 인덱스 :열인덱스
#기본 인덱싱 [] -> 슬라이싱 : 행인덱싱
df["서울":"인천"]
2015 2010 2005
서울 9904312 9631482 9762546
부산 3448737 3393191 3512547
인천 2894051 2632035 2517680
df["2015"]
서울 9904312
부산 3448737
인천 2894051
대구 2466052
Name: 2015, dtype: int64
#인덱서
#loc[] index를 통해 접근
#iloc[] 순서를 통해 접근
#loc[axis0, axis1]
df.loc["서울":"부산","2015":"2010"]
2015 2010
서울 9904312 9631482
부산 3448737 3393191
df.loc[:,:]
2015 2010 2005
서울 9904312 9631482 9762546
부산 3448737 3393191 3512547
인천 2894051 2632035 2517680
대구 2466052 2431774 2456016
df.iloc[:,1:3]
2010 2005
서울 9631482 9762546
부산 3393191 3512547
인천 2632035 2517680
대구 2431774 2456016
df[df>=2500000]
2015 2010 2005
서울 9904312.0 9631482.0 9762546.0
부산 3448737.0 3393191.0 3512547.0
인천 2894051.0 2632035.0 2517680.0
대구 NaN NaN NaN
df[df['2010']>=2500000]
2015 2010 2005
서울 9904312 9631482 9762546
부산 3448737 3393191 3512547
인천 2894051 2632035 2517680
CSV파일을 불러오기
#pd.read_csv('파일명')
population_number = pd.read_csv('data/population_number.csv',encoding = 'euc-kr', index_col= '도시')
population_number
지역 2015 2010 2005 2000
도시
서울 수도권 9904312 9631482.0 9762546.0 9853972
부산 경상권 3448737 NaN NaN 3655437
인천 수도권 2890451 2632035.0 NaN 2466338
대구 경상권 2466052 2431774.0 2456016.0 2473990
population_number.columns
Index(['지역', '2015', '2010', '2005', '2000'], dtype='object')
# 시리즈.value_count()
population_number['지역'].value_counts()
수도권 2
경상권 2
Name: 지역, dtype: int64
population_number.sort_index()
지역 2015 2010 2005 2000
도시
대구 경상권 2466052 2431774.0 2456016.0 2473990
부산 경상권 3448737 NaN NaN 3655437
서울 수도권 9904312 9631482.0 9762546.0 9853972
인천 수도권 2890451 2632035.0 NaN 2466338
population_number.sort_values('2015')
지역 2015 2010 2005 2000
도시
대구 경상권 2466052 2431774.0 2456016.0 2473990
인천 수도권 2890451 2632035.0 NaN 2466338
부산 경상권 3448737 NaN NaN 3655437
서울 수도권 9904312 9631482.0 9762546.0 9853972
population_number['2010'].sort_values(ascending=False)
#ascending 옵션 : True 일때 오름차순 정렬
도시
서울 9631482.0
인천 2632035.0
대구 2431774.0
부산 NaN
Name: 2010, dtype: float64
#여러개의 컴럼을 기준으로 정렬
population_number.sort_values(by=['지역','2010'], ascending=False)
지역 2015 2010 2005 2000
도시
서울 수도권 9904312 9631482.0 9762546.0 9853972
인천 수도권 2890451 2632035.0 NaN 2466338
대구 경상권 2466052 2431774.0 2456016.0 2473990
부산 경상권 3448737 NaN NaN 3655437
score = pd.read_csv('data/score.csv',encoding = 'euc-kr', index_col = "과목")
score
1반 2반 3반 4반
과목
파이썬 45 44 73 39
DB 76 92 45 69
자바 47 92 45 69
크롤링 92 81 85 40
Web 11 79 47 26
print(score.sum(axis=1).sort_values(ascending=False))
print()
print(score.sum(axis=0))
과목
크롤링 298
DB 282
자바 253
파이썬 201
Web 163
dtype: int64
1반 271
2반 388
3반 295
4반 243
dtype: int64
score['합계'] = score.loc[:,'1반':'4반'].sum(axis = 1)
score
1반 2반 3반 4반 합계
과목
파이썬 45 44 73 39 201
DB 76 92 45 69 282
자바 47 92 45 69 253
크롤링 92 81 85 40 298
Web 11 79 47 26 163
score['평균'] = score.iloc[:, 0:3].mean(axis = 1)
score
1반 2반 3반 4반 합계 평균
과목
파이썬 45 44 73 39 201 54.000000
DB 76 92 45 69 282 71.000000
자바 47 92 45 69 253 61.333333
크롤링 92 81 85 40 298 86.000000
Web 11 79 47 26 163 45.666667
# # 새로운 행이나 열을 만드는 방법
# axis = 0 행에대한 삭제
# axis = 1 열에대한 삭제
# # 만들고 싶은 행/열을 인덱싱 한 후 대입연사자를 통해
# # 값을 넣어주면됌
# score.loc['반평균'] = score.mean()
# score
1반 2반 3반 4반 합계 평균
과목
파이썬 45.0 44.0 73.0 39.0 201.0 54.000000
DB 76.0 92.0 45.0 69.0 282.0 71.000000
자바 47.0 92.0 45.0 69.0 253.0 61.333333
크롤링 92.0 81.0 85.0 40.0 298.0 86.000000
Web 11.0 79.0 47.0 26.0 163.0 45.666667
반평균 54.2 77.6 59.0 48.6 239.4 63.600000
# # score.drop('인덱스이름', axis = 1)
# score.drop('인덱스이름', axis = 1, inplace=True(디폴트값은 False 대체할것인가))
score.max(axis = 1)
과목
파이썬 201.0
DB 282.0
자바 253.0
크롤링 298.0
Web 163.0
반평균 239.4
dtype: float64
score.min(axis = 1)
과목
파이썬 39.0
DB 45.0
자바 45.0
크롤링 40.0
Web 11.0
반평균 48.6
dtype: float64
score.max()
1반 92.0
2반 92.0
3반 85.0
4반 69.0
합계 298.0
평균 86.0
dtype: float64
MaxArr = score.loc[:'Web',:'4반'].max(axis = 1)
MaxArr
과목
파이썬 73.0
DB 92.0
자바 92.0
크롤링 92.0
Web 79.0
dtype: float64
minArr = score.loc[:'Web', :'4반'].min(axis = 1)
minArr
과목
파이썬 39.0
DB 45.0
자바 45.0
크롤링 40.0
Web 11.0
dtype: float64
# # #df.apply(func, axis = 0 or 1)
# # 행이나 열 단위로 더 복잡한 처리를 하고 싶을 떄 사용
# # 판다스 객체에 다른 라이브러리 함수를 적용하는 방법
# # panda 열 혹은 행에 대해 함수를 적용하게 해주는 함수
# # def 함수명 (매개변수):
# 함수 코드
# return
#과목별 가장 큰값과 작은값을 구하시오
score.loc['파이썬'].max()
201.0
#apply용 함수 생성
def max_min(s):
dif = s.max() - s.min()
return dif
score.loc[:'Web',:'4반'].apply(max_min, axis = 1)
과목
파이썬 34.0
DB 47.0
자바 47.0
크롤링 52.0
Web 68.0
dtype: float64
#fillna()
population_number
지역 2015 2010 2005 2000
도시
서울 수도권 9904312 9631482.0 9762546.0 9853972
부산 경상권 3448737 NaN NaN 3655437
인천 수도권 2890451 2632035.0 NaN 2466338
대구 경상권 2466052 2431774.0 2456016.0 2473990
population_number.fillna(0, inplace=True)
population_number
지역 2015 2010 2005 2000
도시
서울 수도권 9904312 9631482.0 9762546.0 9853972
부산 경상권 3448737 0.0 0.0 3655437
인천 수도권 2890451 2632035.0 0.0 2466338
대구 경상권 2466052 2431774.0 2456016.0 2473990
카테고리 생성하기
ages = [0,2,10,21,23,37,31,61,20,41,32,100]
bins = [0,15,25,35,60,99]
label = ['미성년자', '청년','중년', '장년', '노년']
cats = pd.cut(ages, bins, labels=label, right=False) #앞에 어떤 데이터를 카테고리화 할 것 인가
#pd.cut(카테고리화를 진행할 데이터, 카테고리화를 진행할 범위, labels = 각 카테고리별 이름, right = 기본적으로 True 2번째 매개변수로 오른쪽 범위값을 포함하고 왼쪽은 포함하지 않음 )
cats
['미성년자', '미성년자', '미성년자', '청년', '청년', ..., '노년', '청년', '장년', '중년', NaN]
Length: 12
Categories (5, object): ['미성년자' < '청년' < '중년' < '장년' < '노년']
type(cats)
pandas.core.arrays.categorical.Categorical
agedf = pd.DataFrame(ages, columns=['ages'])
agedf
ages
0 0
1 2
2 10
3 21
4 23
5 37
6 31
7 61
8 20
9 41
10 32
11 100
agedf['age_cat'] = cats
agedf
ages age_cat
0 0 미성년자
1 2 미성년자
2 10 미성년자
3 21 청년
4 23 청년
5 37 장년
6 31 중년
7 61 노년
8 20 청년
9 41 장년
10 32 중년
11 100 NaN
df1 = pd.DataFrame({'A': ['A0', 'A1', 'A2', 'A3'],
'B': ['B0', 'B1', 'B2', 'B3'],
'C': ['C0', 'C1', 'C2', 'C3'],
'D': ['D0', 'D1', 'D2', 'D3']},
index=[0, 1, 2, 3])
df2 = pd.DataFrame({'A': ['A4', 'A5', 'A6', 'A7'],
'B': ['B4', 'B5', 'B6', 'B7'],
'C': ['C4', 'C5', 'C6', 'C7'],
'D': ['D4', 'D5', 'D6', 'D7']},
index=[4, 5, 6, 7])
df3 = pd.DataFrame({'A': ['A8', 'A9', 'A10', 'A11'],
'B': ['B8', 'B9', 'B10', 'B11'],
'C': ['C8', 'C9', 'C10', 'C11'],
'D': ['D8', 'D9', 'D10', 'D11']},
index=[8, 9, 10, 11])
display(df1)
display(df2)
display(df3)
A B C D
0 A0 B0 C0 D0
1 A1 B1 C1 D1
2 A2 B2 C2 D2
3 A3 B3 C3 D3
A B C D
4 A4 B4 C4 D4
5 A5 B5 C5 D5
6 A6 B6 C6 D6
7 A7 B7 C7 D7
A B C D
8 A8 B8 C8 D8
9 A9 B9 C9 D9
10 A10 B10 C10 D10
11 A11 B11 C11 D11
pd.concat([df1, df2, df3])
A B C D
0 A0 B0 C0 D0
1 A1 B1 C1 D1
2 A2 B2 C2 D2
3 A3 B3 C3 D3
4 A4 B4 C4 D4
5 A5 B5 C5 D5
6 A6 B6 C6 D6
7 A7 B7 C7 D7
8 A8 B8 C8 D8
9 A9 B9 C9 D9
10 A10 B10 C10 D10
11 A11 B11 C11 D11
result = pd.concat([df1, df2, df3], keys=['x','y','z'])
#concat시 key를 부여하면 다중 index가 된다.
A B C D
x 0 A0 B0 C0 D0
1 A1 B1 C1 D1
2 A2 B2 C2 D2
3 A3 B3 C3 D3
y 4 A4 B4 C4 D4
5 A5 B5 C5 D5
6 A6 B6 C6 D6
7 A7 B7 C7 D7
z 8 A8 B8 C8 D8
9 A9 B9 C9 D9
10 A10 B10 C10 D10
11 A11 B11 C11 D11
result.index
MultiIndex([('x', 0),
('x', 1),
('x', 2),
('x', 3),
('y', 4),
('y', 5),
('y', 6),
('y', 7),
('z', 8),
('z', 9),
('z', 10),
('z', 11)],
)
#멀티인덱싱에대해 접근하기 위해선 튜플로 멀티인덱스를 사용하여 접근한다.
result.loc[('y',5 )]
A A5
B B5
C C5
D D5
Name: (y, 5), dtype: object
df4 = pd.DataFrame({'B': ['B2', 'B3', 'B6', 'B7'],
'D': ['D2', 'D3', 'D6', 'D7'],
'F': ['F2', 'F3', 'F6', 'F7']},
index=[2, 3, 6, 7])
df4
B D F
2 B2 D2 F2
3 B3 D3 F3
6 B6 D6 F6
7 B7 D7 F7
result = pd.concat([df1,df4],axis = 1)
result
A B C D B D F
0 A0 B0 C0 D0 NaN NaN NaN
1 A1 B1 C1 D1 NaN NaN NaN
2 A2 B2 C2 D2 B2 D2 F2
3 A3 B3 C3 D3 B3 D3 F3
6 NaN NaN NaN NaN B6 D6 F6
7 NaN NaN NaN NaN B7 D7 F7
pd.concat([df1,df4], axis = 1, join='inner')
A B C D B D F
2 A2 B2 C2 D2 B2 D2 F2
3 A3 B3 C3 D3 B3 D3 F3
pd.concat([df1, df4], ignore_index = True)
A B C D F
0 A0 B0 C0 D0 NaN
1 A1 B1 C1 D1 NaN
2 A2 B2 C2 D2 NaN
3 A3 B3 C3 D3 NaN
4 NaN B2 NaN D2 F2
5 NaN B3 NaN D3 F3
6 NaN B6 NaN D6 F6
7 NaN B7 NaN D7 F7
#concat() 인덱스/컬럼에 영향을 받아 dataframe 병합
#merge() 값 기준으로 병합
df5 = pd.DataFrame({'key' : ['K0','K2','K3','K4'],
'A':['A0','A1','A2','A3'],
'B':['B0','B1','B2','B3']})
df6 = pd.DataFrame({'key' : ['K0','K1','K2','K3'],
'C':['C0','C1','C2','C3'],
'D':['D0','D1','D2','D3']})
display(pd.merge(df5, df6, on= 'key'))
pd.merge(df5, df6, on='key', how='outer')
key A B C D
0 K0 A0 B0 C0 D0
1 K2 A1 B1 C2 D2
2 K3 A2 B2 C3 D3
key A B C D
0 K0 A0 B0 C0 D0
1 K2 A1 B1 C2 D2
2 K3 A2 B2 C3 D3
3 K4 A3 B3 NaN NaN
4 K1 NaN NaN C1 D1
pd.merge(df5, df6, on='key', how='left')
key A B C D
0 K0 A0 B0 C0 D0
1 K2 A1 B1 C2 D2
2 K3 A2 B2 C3 D3
3 K4 A3 B3 NaN NaN
pd.merge(df5, df6, on='key', how='right')
key A B C D
0 K0 A0 B0 C0 D0
1 K1 NaN NaN C1 D1
2 K2 A1 B1 C2 D2
3 K3 A2 B2 C3 D3
df2015 = pd.read_csv("data/2015.csv", encoding = 'euc-kr', index_col = "관서명")
df2016 = pd.read_csv("data/2016.csv", encoding = 'euc-kr', index_col = "관서명")
df2017 = pd.read_csv("data/2017.csv", encoding = 'euc-kr', index_col = "관서명")
display(df2015.head(3))
display(df2016.head(3))
display(df2017.head(3))
구분 살인 강도 강간·강제추행 절도 폭력
관서명
광주지방경찰청계 발생건수 18 44 750 8425 9593
광주지방경찰청계 검거건수 18 47 758 5409 8301
광주지방경찰청계 검거인원 17 66 776 3433 11774
구분 살인 강도 강간·강제추행 절도 폭력
관서명
광주지방경찰청계 발생건수 17 47 701 6052 8599
광주지방경찰청계 검거건수 18 47 713 4242 7631
광주지방경찰청계 검거인원 21 54 758 3455 10747
구분 살인 강도 강간·강제추행 절도 폭력
관서명
광주지방경찰청계 발생건수 9 33 725 4816 8366
광주지방경찰청계 검거건수 9 32 732 3487 7553
광주지방경찰청계 검거인원 10 61 824 3046 11018
#데이터 프레임 info()
df2015.info()
<class 'pandas.core.frame.DataFrame'>
Index: 36 entries, 광주지방경찰청계 to 광주광산경찰서
Data columns (total 6 columns):
# Column Non-Null Count Dtype
--- ------ -------------- -----
0 구분 36 non-null object
1 살인 36 non-null int64
2 강도 36 non-null int64
3 강간·강제추행 36 non-null int64
4 절도 36 non-null int64
5 폭력 36 non-null int64
dtypes: int64(5), object(1)
memory usage: 2.0+ KB
df2016.info()
<class 'pandas.core.frame.DataFrame'>
Index: 36 entries, 광주지방경찰청계 to 광주광산경찰서
Data columns (total 6 columns):
# Column Non-Null Count Dtype
--- ------ -------------- -----
0 구분 36 non-null object
1 살인 36 non-null int64
2 강도 36 non-null int64
3 강간·강제추행 36 non-null int64
4 절도 36 non-null int64
5 폭력 36 non-null int64
dtypes: int64(5), object(1)
memory usage: 2.0+ KB
df2017.info()
<class 'pandas.core.frame.DataFrame'>
Index: 42 entries, 광주지방경찰청계 to 광주광산경찰서
Data columns (total 6 columns):
# Column Non-Null Count Dtype
--- ------ -------------- -----
0 구분 42 non-null object
1 살인 42 non-null int64
2 강도 42 non-null int64
3 강간·강제추행 42 non-null int64
4 절도 42 non-null int64
5 폭력 42 non-null int64
dtypes: int64(5), object(1)
memory usage: 2.3+ KB
df2017.index.unique()
Index(['광주지방경찰청계', '광주지방경찰청', '광주동부경찰서', '광주서부경찰서', '광주남부경찰서', '광주북부경찰서',
'광주광산경찰서'],
dtype='object', name='관서명')
print(df2015.index.unique())
print(df2017.index.unique())
Index(['광주지방경찰청계', '광주동부경찰서', '광주서부경찰서', '광주남부경찰서', '광주북부경찰서', '광주광산경찰서'], dtype='object', name='관서명')
Index(['광주지방경찰청계', '광주지방경찰청', '광주동부경찰서', '광주서부경찰서', '광주남부경찰서', '광주북부경찰서',
'광주광산경찰서'],
dtype='object', name='관서명')
#drop 함수는 실행한다고 해서 바로 반영 x
df2017 = df2017.drop('광주지방경찰청', axis=0)
df2015['총계'] = df2015.loc[: ,'살인':'폭력'].sum(axis = 1)
display(df2015.head(3))
구분 살인 강도 강간·강제추행 절도 폭력 총계
관서명
광주지방경찰청계 발생건수 18 44 750 8425 9593 18830
광주지방경찰청계 검거건수 18 47 758 5409 8301 14533
광주지방경찰청계 검거인원 17 66 776 3433 11774 16066
df2016['총계'] = df2016.loc[: ,'살인':'폭력'].sum(axis = 1)
display(df2016.head(3))
구분 살인 강도 강간·강제추행 절도 폭력 총계
관서명
광주지방경찰청계 발생건수 17 47 701 6052 8599 15416
광주지방경찰청계 검거건수 18 47 713 4242 7631 12651
광주지방경찰청계 검거인원 21 54 758 3455 10747 15035
df2017['총계'] = df2017.loc[: ,'살인':'폭력'].sum(axis = 1)
display(df2017.head(3))
<ipython-input-235-08220ea226e4>:1: SettingWithCopyWarning:
A value is trying to be set on a copy of a slice from a DataFrame.
Try using .loc[row_indexer,col_indexer] = value instead
See the caveats in the documentation: https://pandas.pydata.org/pandas-docs/stable/user_guide/indexing.html#returning-a-view-versus-a-copy
df2017['총계'] = df2017.loc[: ,'살인':'폭력'].sum(axis = 1)
구분 살인 강도 강간·강제추행 절도 폭력 총계
관서명
광주지방경찰청계 발생건수 9 33 725 4816 8366 13949
광주지방경찰청계 검거건수 9 32 732 3487 7553 11813
광주지방경찰청계 검거인원 10 61 824 3046 11018 14959
s1 = df2015[df2015['구분'] =='발생건수'].loc[:,'총계']
s1.name = '2015총계'
s1
관서명
광주지방경찰청계 18830
광주동부경찰서 2355
광주서부경찰서 4720
광주남부경찰서 2117
광주북부경찰서 5466
광주광산경찰서 4172
Name: 2015총계, dtype: int64
s2 = df2016[df2016['구분'] =='발생건수'].loc[:,'총계']
s2.name = '2016총계'
s2
관서명
광주지방경찰청계 15416
광주동부경찰서 2068
광주서부경찰서 3892
광주남부경찰서 1865
광주북부경찰서 4148
광주광산경찰서 3443
Name: 2016총계, dtype: int64
s3 = df2017[df2017['구분'] =='발생건수'].loc[:,'총계']
s3.name = '2017총계'
s3
관서명
광주지방경찰청계 13949
광주동부경찰서 1799
광주서부경찰서 3638
광주남부경찰서 1547
광주북부경찰서 3945
광주광산경찰서 3020
Name: 2017총계, dtype: int64
# 2016- 2015년도 범죄증감률 s4
# 2017-2016년도 범죄증감률 s5
s4=(s2-s1)/s1*100
s5=(s3-s2)/s2*100
display(s4)
display(s5)
관서명
광주지방경찰청계 -18.130643
광주동부경찰서 -12.186837
광주서부경찰서 -17.542373
광주남부경찰서 -11.903637
광주북부경찰서 -24.112697
광주광산경찰서 -17.473634
dtype: float64
관서명
광주지방경찰청계 -9.516087
광주동부경찰서 -13.007737
광주서부경찰서 -6.526208
광주남부경찰서 -17.050938
광주북부경찰서 -4.893925
광주광산경찰서 -12.285797
dtype: float64
s4.name = '2015-2016 증감률'
s5.name = '2016-2017 증감률'
s4
관서명
광주지방경찰청계 -18.130643
광주동부경찰서 -12.186837
광주서부경찰서 -17.542373
광주남부경찰서 -11.903637
광주북부경찰서 -24.112697
광주광산경찰서 -17.473634
Name: 2015-2016 증감률, dtype: float64
display(s4)
관서명
광주지방경찰청계 -18.130643
광주동부경찰서 -12.186837
광주서부경찰서 -17.542373
광주남부경찰서 -11.903637
광주북부경찰서 -24.112697
광주광산경찰서 -17.473634
Name: 2015-2016 증감률, dtype: float64
total = pd.concat([s1, s4, s2, s5, s3], axis=1)
total
2015총계 2015-2016 증감률 2016총계 2016-2017 증감률 2017총계
관서명
광주지방경찰청계 18830 -18.130643 15416 -9.516087 13949
광주동부경찰서 2355 -12.186837 2068 -13.007737 1799
광주서부경찰서 4720 -17.542373 3892 -6.526208 3638
광주남부경찰서 2117 -11.903637 1865 -17.050938 1547
광주북부경찰서 5466 -24.112697 4148 -4.893925 3945
광주광산경찰서 4172 -17.473634 3443 -12.285797 3020
import pandas as pd
list = [9904312, 3448737, 2890451, 266052]
city = ['서울', '부산', '인천', '대구']
population = pd.Series(list, index = city)
population
서울 9904312
부산 3448737
인천 2890451
대구 266052
dtype: int64
population.values
array([9904312, 3448737, 2890451, 266052], dtype=int64)
population.index
Index(['서울', '부산', '인천', '대구'], dtype='object')
population.dtype
dtype('int64')
population
population.index.name = '도시'
population
도시
서울 9904312
부산 3448737
인천 2890451
대구 266052
dtype: int64
population/1000000
도시
서울 9.904312
부산 3.448737
인천 2.890451
대구 0.266052
dtype: float64
population>=1000000
도시
서울 True
부산 True
인천 True
대구 False
dtype: bool
Series 인덱싱
population[0], population['서울']
(9904312, 9904312)
population
도시
서울 9904312
부산 3448737
인천 2890451
대구 266052
dtype: int64
#여러개 요소 인덱싱
population[[0,3,1]]
도시
서울 9904312
대구 266052
부산 3448737
dtype: int64
population[['서울','대구','부산']]
도시
서울 9904312
대구 266052
부산 3448737
dtype: int64
bol=population >=2500000
print(population[bol])
도시
서울 9904312
부산 3448737
인천 2890451
dtype: int64
bol1 = population >= 2500000
bol2 = population <= 5000000
population[bol]
도시
서울 9904312
부산 3448737
인천 2890451
dtype: int64
bol1 & bol2
도시
서울 False
부산 True
인천 True
대구 False
dtype: bool
population[bol1 & bol2]
도시
부산 3448737
인천 2890451
dtype: int64
population[1:3] #순서번호
도시
부산 3448737
인천 2890451
dtype: int64
population["부산":"대구"]
도시
부산 3448737
인천 2890451
대구 266052
dtype: int64
population['부산':'대구']
도시
부산 3448737
인천 2890451
대구 266052
dtype: int64
data = {"아구몬":9631482, "피요몬":3393197, "텐타몬":1490158, "가트몬":2632035}
digimon = pd.Series(data)
digimon
아구몬 9631482
피요몬 3393197
텐타몬 1490158
가트몬 2632035
dtype: int64
digimon.index
Index(['아구몬', '피요몬', '텐타몬', '가트몬'], dtype='object')
data2 = {"아구몬":9904312, "피요몬":3448737, "텐타몬":2466052, "니드몬":2890451}
digimon_levelup = pd.Series(data2)
digimon_levelup
아구몬 9904312
피요몬 3448737
텐타몬 2466052
니드몬 2890451
dtype: int64
attack = digimon_levelup - digimon #시리즈와 시리즈 연산 같은 인덱스를 가진 Value끼리 연산을 진행
bol = attack.notnull()
#notnull 비어있는 값(결측지)이면 False 그외 True
attack[bol]
아구몬 272830.0
텐타몬 975894.0
피요몬 55540.0
dtype: float64
#비어있는 데이터 확인
bol2 = attack.isnull()
attack[bol2]
가트몬 NaN
니드몬 NaN
dtype: float64
rp = (digimon_levelup - digimon)/digimon * 100
rp[rp.notnull()]
아구몬 2.832690
텐타몬 65.489297
피요몬 1.636804
dtype: float64
rp['아구몬'] = 1.6
rp['파닥몬'] = 5.5
# del rp['피요몬']
rp
가트몬 NaN
니드몬 NaN
아구몬 1.600000
텐타몬 65.489297
피요몬 1.636804
파닥몬 5.500000
dtype: float64
data = {"2015":[9904312,3448737,2894051,2466052],
"2010":[9631482,3393191,2632035,2431774]}
df = pd.DataFrame(data) #data, index = ""가능
df
2015 2010
0 9904312 9631482
1 3448737 3393191
2 2894051 2632035
3 2466052 2431774
df.index = ['서울', '부산', '인천', '대구']
df
2015 2010
서울 9904312 9631482
부산 3448737 3393191
인천 2894051 2632035
대구 2466052 2431774
list1 = [[9904312,3448737,2894051,2466052],
[9631482,3393191,2632035,2431774]]
list1
df2 = pd.DataFrame(list1, index=["2015","2010"], columns = ["서울", "부산", "인천","대구"])
df2
서울 부산 인천 대구
2015 9904312 3448737 2894051 2466052
2010 9631482 3393191 2632035 2431774
#데이터프레임.T : 전치(행과 열을 뒤집어줌)
df2.T
2015 2010
서울 9904312 9631482
부산 3448737 3393191
인천 2894051 2632035
대구 2466052 2431774
df.values
array([[9904312, 9631482],
[3448737, 3393191],
[2894051, 2632035],
[2466052, 2431774]], dtype=int64)
# dtype = object ->문자열
df.index
Index(['서울', '부산', '인천', '대구'], dtype='object')
df.columns
Index(['2015', '2010'], dtype='object')
#데이터프레임 [컬럼이름]
df["2015"]
df[['2015', '2010']]
2015 2010
서울 9904312 9631482
부산 3448737 3393191
인천 2894051 2632035
대구 2466052 2431774
df['2005'] = [9762546,3512547,2517680,2456016]
df
2015 2010 2005
서울 9904312 9631482 9762546
부산 3448737 3393191 3512547
인천 2894051 2632035 2517680
대구 2466052 2431774 2456016
#기본 인덱싱 [] 방법 -> 인덱스 :열인덱스
#기본 인덱싱 [] -> 슬라이싱 : 행인덱싱
df["서울":"인천"]
2015 2010 2005
서울 9904312 9631482 9762546
부산 3448737 3393191 3512547
인천 2894051 2632035 2517680
df["2015"]
서울 9904312
부산 3448737
인천 2894051
대구 2466052
Name: 2015, dtype: int64
#인덱서
#loc[] index를 통해 접근
#iloc[] 순서를 통해 접근
#loc[axis0, axis1]
df.loc["서울":"부산","2015":"2010"]
2015 2010
서울 9904312 9631482
부산 3448737 3393191
df.loc[:,:]
2015 2010 2005
서울 9904312 9631482 9762546
부산 3448737 3393191 3512547
인천 2894051 2632035 2517680
대구 2466052 2431774 2456016
df.iloc[:,1:3]
2010 2005
서울 9631482 9762546
부산 3393191 3512547
인천 2632035 2517680
대구 2431774 2456016
df[df>=2500000]
2015 2010 2005
서울 9904312.0 9631482.0 9762546.0
부산 3448737.0 3393191.0 3512547.0
인천 2894051.0 2632035.0 2517680.0
대구 NaN NaN NaN
df[df['2010']>=2500000]
2015 2010 2005
서울 9904312 9631482 9762546
부산 3448737 3393191 3512547
인천 2894051 2632035 2517680
CSV파일을 불러오기
#pd.read_csv('파일명')
population_number = pd.read_csv('data/population_number.csv',encoding = 'euc-kr', index_col= '도시')
population_number
지역 2015 2010 2005 2000
도시
서울 수도권 9904312 9631482.0 9762546.0 9853972
부산 경상권 3448737 NaN NaN 3655437
인천 수도권 2890451 2632035.0 NaN 2466338
대구 경상권 2466052 2431774.0 2456016.0 2473990
population_number.columns
Index(['지역', '2015', '2010', '2005', '2000'], dtype='object')
# 시리즈.value_count()
population_number['지역'].value_counts()
수도권 2
경상권 2
Name: 지역, dtype: int64
population_number.sort_index()
지역 2015 2010 2005 2000
도시
대구 경상권 2466052 2431774.0 2456016.0 2473990
부산 경상권 3448737 NaN NaN 3655437
서울 수도권 9904312 9631482.0 9762546.0 9853972
인천 수도권 2890451 2632035.0 NaN 2466338
population_number.sort_values('2015')
지역 2015 2010 2005 2000
도시
대구 경상권 2466052 2431774.0 2456016.0 2473990
인천 수도권 2890451 2632035.0 NaN 2466338
부산 경상권 3448737 NaN NaN 3655437
서울 수도권 9904312 9631482.0 9762546.0 9853972
population_number['2010'].sort_values(ascending=False)
#ascending 옵션 : True 일때 오름차순 정렬
도시
서울 9631482.0
인천 2632035.0
대구 2431774.0
부산 NaN
Name: 2010, dtype: float64
#여러개의 컴럼을 기준으로 정렬
population_number.sort_values(by=['지역','2010'], ascending=False)
지역 2015 2010 2005 2000
도시
서울 수도권 9904312 9631482.0 9762546.0 9853972
인천 수도권 2890451 2632035.0 NaN 2466338
대구 경상권 2466052 2431774.0 2456016.0 2473990
부산 경상권 3448737 NaN NaN 3655437
score = pd.read_csv('data/score.csv',encoding = 'euc-kr', index_col = "과목")
score
1반 2반 3반 4반
과목
파이썬 45 44 73 39
DB 76 92 45 69
자바 47 92 45 69
크롤링 92 81 85 40
Web 11 79 47 26
print(score.sum(axis=1).sort_values(ascending=False))
print()
print(score.sum(axis=0))
과목
크롤링 298
DB 282
자바 253
파이썬 201
Web 163
dtype: int64
1반 271
2반 388
3반 295
4반 243
dtype: int64
score['합계'] = score.loc[:,'1반':'4반'].sum(axis = 1)
score
1반 2반 3반 4반 합계
과목
파이썬 45 44 73 39 201
DB 76 92 45 69 282
자바 47 92 45 69 253
크롤링 92 81 85 40 298
Web 11 79 47 26 163
score['평균'] = score.iloc[:, 0:3].mean(axis = 1)
score
1반 2반 3반 4반 합계 평균
과목
파이썬 45 44 73 39 201 54.000000
DB 76 92 45 69 282 71.000000
자바 47 92 45 69 253 61.333333
크롤링 92 81 85 40 298 86.000000
Web 11 79 47 26 163 45.666667
# # 새로운 행이나 열을 만드는 방법
# axis = 0 행에대한 삭제
# axis = 1 열에대한 삭제
# # 만들고 싶은 행/열을 인덱싱 한 후 대입연사자를 통해
# # 값을 넣어주면됌
# score.loc['반평균'] = score.mean()
# score
1반 2반 3반 4반 합계 평균
과목
파이썬 45.0 44.0 73.0 39.0 201.0 54.000000
DB 76.0 92.0 45.0 69.0 282.0 71.000000
자바 47.0 92.0 45.0 69.0 253.0 61.333333
크롤링 92.0 81.0 85.0 40.0 298.0 86.000000
Web 11.0 79.0 47.0 26.0 163.0 45.666667
반평균 54.2 77.6 59.0 48.6 239.4 63.600000
# # score.drop('인덱스이름', axis = 1)
# score.drop('인덱스이름', axis = 1, inplace=True(디폴트값은 False 대체할것인가))
score.max(axis = 1)
과목
파이썬 201.0
DB 282.0
자바 253.0
크롤링 298.0
Web 163.0
반평균 239.4
dtype: float64
score.min(axis = 1)
과목
파이썬 39.0
DB 45.0
자바 45.0
크롤링 40.0
Web 11.0
반평균 48.6
dtype: float64
score.max()
1반 92.0
2반 92.0
3반 85.0
4반 69.0
합계 298.0
평균 86.0
dtype: float64
MaxArr = score.loc[:'Web',:'4반'].max(axis = 1)
MaxArr
과목
파이썬 73.0
DB 92.0
자바 92.0
크롤링 92.0
Web 79.0
dtype: float64
minArr = score.loc[:'Web', :'4반'].min(axis = 1)
minArr
과목
파이썬 39.0
DB 45.0
자바 45.0
크롤링 40.0
Web 11.0
dtype: float64
# # #df.apply(func, axis = 0 or 1)
# # 행이나 열 단위로 더 복잡한 처리를 하고 싶을 떄 사용
# # 판다스 객체에 다른 라이브러리 함수를 적용하는 방법
# # panda 열 혹은 행에 대해 함수를 적용하게 해주는 함수
# # def 함수명 (매개변수):
# 함수 코드
# return
#과목별 가장 큰값과 작은값을 구하시오
score.loc['파이썬'].max()
201.0
#apply용 함수 생성
def max_min(s):
dif = s.max() - s.min()
return dif
score.loc[:'Web',:'4반'].apply(max_min, axis = 1)
과목
파이썬 34.0
DB 47.0
자바 47.0
크롤링 52.0
Web 68.0
dtype: float64
#fillna()
population_number
지역 2015 2010 2005 2000
도시
서울 수도권 9904312 9631482.0 9762546.0 9853972
부산 경상권 3448737 NaN NaN 3655437
인천 수도권 2890451 2632035.0 NaN 2466338
대구 경상권 2466052 2431774.0 2456016.0 2473990
population_number.fillna(0, inplace=True)
population_number
지역 2015 2010 2005 2000
도시
서울 수도권 9904312 9631482.0 9762546.0 9853972
부산 경상권 3448737 0.0 0.0 3655437
인천 수도권 2890451 2632035.0 0.0 2466338
대구 경상권 2466052 2431774.0 2456016.0 2473990
카테고리 생성하기
ages = [0,2,10,21,23,37,31,61,20,41,32,100]
bins = [0,15,25,35,60,99]
label = ['미성년자', '청년','중년', '장년', '노년']
cats = pd.cut(ages, bins, labels=label, right=False) #앞에 어떤 데이터를 카테고리화 할 것 인가
#pd.cut(카테고리화를 진행할 데이터, 카테고리화를 진행할 범위, labels = 각 카테고리별 이름, right = 기본적으로 True 2번째 매개변수로 오른쪽 범위값을 포함하고 왼쪽은 포함하지 않음 )
cats
['미성년자', '미성년자', '미성년자', '청년', '청년', ..., '노년', '청년', '장년', '중년', NaN]
Length: 12
Categories (5, object): ['미성년자' < '청년' < '중년' < '장년' < '노년']
type(cats)
pandas.core.arrays.categorical.Categorical
agedf = pd.DataFrame(ages, columns=['ages'])
agedf
ages
0 0
1 2
2 10
3 21
4 23
5 37
6 31
7 61
8 20
9 41
10 32
11 100
agedf['age_cat'] = cats
agedf
ages age_cat
0 0 미성년자
1 2 미성년자
2 10 미성년자
3 21 청년
4 23 청년
5 37 장년
6 31 중년
7 61 노년
8 20 청년
9 41 장년
10 32 중년
11 100 NaN
df1 = pd.DataFrame({'A': ['A0', 'A1', 'A2', 'A3'],
'B': ['B0', 'B1', 'B2', 'B3'],
'C': ['C0', 'C1', 'C2', 'C3'],
'D': ['D0', 'D1', 'D2', 'D3']},
index=[0, 1, 2, 3])
df2 = pd.DataFrame({'A': ['A4', 'A5', 'A6', 'A7'],
'B': ['B4', 'B5', 'B6', 'B7'],
'C': ['C4', 'C5', 'C6', 'C7'],
'D': ['D4', 'D5', 'D6', 'D7']},
index=[4, 5, 6, 7])
df3 = pd.DataFrame({'A': ['A8', 'A9', 'A10', 'A11'],
'B': ['B8', 'B9', 'B10', 'B11'],
'C': ['C8', 'C9', 'C10', 'C11'],
'D': ['D8', 'D9', 'D10', 'D11']},
index=[8, 9, 10, 11])
display(df1)
display(df2)
display(df3)
A B C D
0 A0 B0 C0 D0
1 A1 B1 C1 D1
2 A2 B2 C2 D2
3 A3 B3 C3 D3
A B C D
4 A4 B4 C4 D4
5 A5 B5 C5 D5
6 A6 B6 C6 D6
7 A7 B7 C7 D7
A B C D
8 A8 B8 C8 D8
9 A9 B9 C9 D9
10 A10 B10 C10 D10
11 A11 B11 C11 D11
pd.concat([df1, df2, df3])
A B C D
0 A0 B0 C0 D0
1 A1 B1 C1 D1
2 A2 B2 C2 D2
3 A3 B3 C3 D3
4 A4 B4 C4 D4
5 A5 B5 C5 D5
6 A6 B6 C6 D6
7 A7 B7 C7 D7
8 A8 B8 C8 D8
9 A9 B9 C9 D9
10 A10 B10 C10 D10
11 A11 B11 C11 D11
result = pd.concat([df1, df2, df3], keys=['x','y','z'])
#concat시 key를 부여하면 다중 index가 된다.
A B C D
x 0 A0 B0 C0 D0
1 A1 B1 C1 D1
2 A2 B2 C2 D2
3 A3 B3 C3 D3
y 4 A4 B4 C4 D4
5 A5 B5 C5 D5
6 A6 B6 C6 D6
7 A7 B7 C7 D7
z 8 A8 B8 C8 D8
9 A9 B9 C9 D9
10 A10 B10 C10 D10
11 A11 B11 C11 D11
result.index
MultiIndex([('x', 0),
('x', 1),
('x', 2),
('x', 3),
('y', 4),
('y', 5),
('y', 6),
('y', 7),
('z', 8),
('z', 9),
('z', 10),
('z', 11)],
)
#멀티인덱싱에대해 접근하기 위해선 튜플로 멀티인덱스를 사용하여 접근한다.
result.loc[('y',5 )]
A A5
B B5
C C5
D D5
Name: (y, 5), dtype: object
df4 = pd.DataFrame({'B': ['B2', 'B3', 'B6', 'B7'],
'D': ['D2', 'D3', 'D6', 'D7'],
'F': ['F2', 'F3', 'F6', 'F7']},
index=[2, 3, 6, 7])
df4
B D F
2 B2 D2 F2
3 B3 D3 F3
6 B6 D6 F6
7 B7 D7 F7
result = pd.concat([df1,df4],axis = 1)
result
A B C D B D F
0 A0 B0 C0 D0 NaN NaN NaN
1 A1 B1 C1 D1 NaN NaN NaN
2 A2 B2 C2 D2 B2 D2 F2
3 A3 B3 C3 D3 B3 D3 F3
6 NaN NaN NaN NaN B6 D6 F6
7 NaN NaN NaN NaN B7 D7 F7
pd.concat([df1,df4], axis = 1, join='inner')
A B C D B D F
2 A2 B2 C2 D2 B2 D2 F2
3 A3 B3 C3 D3 B3 D3 F3
pd.concat([df1, df4], ignore_index = True)
A B C D F
0 A0 B0 C0 D0 NaN
1 A1 B1 C1 D1 NaN
2 A2 B2 C2 D2 NaN
3 A3 B3 C3 D3 NaN
4 NaN B2 NaN D2 F2
5 NaN B3 NaN D3 F3
6 NaN B6 NaN D6 F6
7 NaN B7 NaN D7 F7
#concat() 인덱스/컬럼에 영향을 받아 dataframe 병합
#merge() 값 기준으로 병합
df5 = pd.DataFrame({'key' : ['K0','K2','K3','K4'],
'A':['A0','A1','A2','A3'],
'B':['B0','B1','B2','B3']})
df6 = pd.DataFrame({'key' : ['K0','K1','K2','K3'],
'C':['C0','C1','C2','C3'],
'D':['D0','D1','D2','D3']})
display(pd.merge(df5, df6, on= 'key'))
pd.merge(df5, df6, on='key', how='outer')
key A B C D
0 K0 A0 B0 C0 D0
1 K2 A1 B1 C2 D2
2 K3 A2 B2 C3 D3
key A B C D
0 K0 A0 B0 C0 D0
1 K2 A1 B1 C2 D2
2 K3 A2 B2 C3 D3
3 K4 A3 B3 NaN NaN
4 K1 NaN NaN C1 D1
pd.merge(df5, df6, on='key', how='left')
key A B C D
0 K0 A0 B0 C0 D0
1 K2 A1 B1 C2 D2
2 K3 A2 B2 C3 D3
3 K4 A3 B3 NaN NaN
pd.merge(df5, df6, on='key', how='right')
key A B C D
0 K0 A0 B0 C0 D0
1 K1 NaN NaN C1 D1
2 K2 A1 B1 C2 D2
3 K3 A2 B2 C3 D3
df2015 = pd.read_csv("data/2015.csv", encoding = 'euc-kr', index_col = "관서명")
df2016 = pd.read_csv("data/2016.csv", encoding = 'euc-kr', index_col = "관서명")
df2017 = pd.read_csv("data/2017.csv", encoding = 'euc-kr', index_col = "관서명")
display(df2015.head(3))
display(df2016.head(3))
display(df2017.head(3))
구분 살인 강도 강간·강제추행 절도 폭력
관서명
광주지방경찰청계 발생건수 18 44 750 8425 9593
광주지방경찰청계 검거건수 18 47 758 5409 8301
광주지방경찰청계 검거인원 17 66 776 3433 11774
구분 살인 강도 강간·강제추행 절도 폭력
관서명
광주지방경찰청계 발생건수 17 47 701 6052 8599
광주지방경찰청계 검거건수 18 47 713 4242 7631
광주지방경찰청계 검거인원 21 54 758 3455 10747
구분 살인 강도 강간·강제추행 절도 폭력
관서명
광주지방경찰청계 발생건수 9 33 725 4816 8366
광주지방경찰청계 검거건수 9 32 732 3487 7553
광주지방경찰청계 검거인원 10 61 824 3046 11018
#데이터 프레임 info()
df2015.info()
<class 'pandas.core.frame.DataFrame'>
Index: 36 entries, 광주지방경찰청계 to 광주광산경찰서
Data columns (total 6 columns):
# Column Non-Null Count Dtype
--- ------ -------------- -----
0 구분 36 non-null object
1 살인 36 non-null int64
2 강도 36 non-null int64
3 강간·강제추행 36 non-null int64
4 절도 36 non-null int64
5 폭력 36 non-null int64
dtypes: int64(5), object(1)
memory usage: 2.0+ KB
df2016.info()
<class 'pandas.core.frame.DataFrame'>
Index: 36 entries, 광주지방경찰청계 to 광주광산경찰서
Data columns (total 6 columns):
# Column Non-Null Count Dtype
--- ------ -------------- -----
0 구분 36 non-null object
1 살인 36 non-null int64
2 강도 36 non-null int64
3 강간·강제추행 36 non-null int64
4 절도 36 non-null int64
5 폭력 36 non-null int64
dtypes: int64(5), object(1)
memory usage: 2.0+ KB
df2017.info()
<class 'pandas.core.frame.DataFrame'>
Index: 42 entries, 광주지방경찰청계 to 광주광산경찰서
Data columns (total 6 columns):
# Column Non-Null Count Dtype
--- ------ -------------- -----
0 구분 42 non-null object
1 살인 42 non-null int64
2 강도 42 non-null int64
3 강간·강제추행 42 non-null int64
4 절도 42 non-null int64
5 폭력 42 non-null int64
dtypes: int64(5), object(1)
memory usage: 2.3+ KB
df2017.index.unique()
Index(['광주지방경찰청계', '광주지방경찰청', '광주동부경찰서', '광주서부경찰서', '광주남부경찰서', '광주북부경찰서',
'광주광산경찰서'],
dtype='object', name='관서명')
print(df2015.index.unique())
print(df2017.index.unique())
Index(['광주지방경찰청계', '광주동부경찰서', '광주서부경찰서', '광주남부경찰서', '광주북부경찰서', '광주광산경찰서'], dtype='object', name='관서명')
Index(['광주지방경찰청계', '광주지방경찰청', '광주동부경찰서', '광주서부경찰서', '광주남부경찰서', '광주북부경찰서',
'광주광산경찰서'],
dtype='object', name='관서명')
#drop 함수는 실행한다고 해서 바로 반영 x
df2017 = df2017.drop('광주지방경찰청', axis=0)
df2015['총계'] = df2015.loc[: ,'살인':'폭력'].sum(axis = 1)
display(df2015.head(3))
구분 살인 강도 강간·강제추행 절도 폭력 총계
관서명
광주지방경찰청계 발생건수 18 44 750 8425 9593 18830
광주지방경찰청계 검거건수 18 47 758 5409 8301 14533
광주지방경찰청계 검거인원 17 66 776 3433 11774 16066
df2016['총계'] = df2016.loc[: ,'살인':'폭력'].sum(axis = 1)
display(df2016.head(3))
구분 살인 강도 강간·강제추행 절도 폭력 총계
관서명
광주지방경찰청계 발생건수 17 47 701 6052 8599 15416
광주지방경찰청계 검거건수 18 47 713 4242 7631 12651
광주지방경찰청계 검거인원 21 54 758 3455 10747 15035
df2017['총계'] = df2017.loc[: ,'살인':'폭력'].sum(axis = 1)
display(df2017.head(3))
<ipython-input-235-08220ea226e4>:1: SettingWithCopyWarning:
A value is trying to be set on a copy of a slice from a DataFrame.
Try using .loc[row_indexer,col_indexer] = value instead
See the caveats in the documentation: https://pandas.pydata.org/pandas-docs/stable/user_guide/indexing.html#returning-a-view-versus-a-copy
df2017['총계'] = df2017.loc[: ,'살인':'폭력'].sum(axis = 1)
구분 살인 강도 강간·강제추행 절도 폭력 총계
관서명
광주지방경찰청계 발생건수 9 33 725 4816 8366 13949
광주지방경찰청계 검거건수 9 32 732 3487 7553 11813
광주지방경찰청계 검거인원 10 61 824 3046 11018 14959
s1 = df2015[df2015['구분'] =='발생건수'].loc[:,'총계']
s1.name = '2015총계'
s1
관서명
광주지방경찰청계 18830
광주동부경찰서 2355
광주서부경찰서 4720
광주남부경찰서 2117
광주북부경찰서 5466
광주광산경찰서 4172
Name: 2015총계, dtype: int64
s2 = df2016[df2016['구분'] =='발생건수'].loc[:,'총계']
s2.name = '2016총계'
s2
관서명
광주지방경찰청계 15416
광주동부경찰서 2068
광주서부경찰서 3892
광주남부경찰서 1865
광주북부경찰서 4148
광주광산경찰서 3443
Name: 2016총계, dtype: int64
s3 = df2017[df2017['구분'] =='발생건수'].loc[:,'총계']
s3.name = '2017총계'
s3
관서명
광주지방경찰청계 13949
광주동부경찰서 1799
광주서부경찰서 3638
광주남부경찰서 1547
광주북부경찰서 3945
광주광산경찰서 3020
Name: 2017총계, dtype: int64
# 2016- 2015년도 범죄증감률 s4
# 2017-2016년도 범죄증감률 s5
s4=(s2-s1)/s1*100
s5=(s3-s2)/s2*100
display(s4)
display(s5)
관서명
광주지방경찰청계 -18.130643
광주동부경찰서 -12.186837
광주서부경찰서 -17.542373
광주남부경찰서 -11.903637
광주북부경찰서 -24.112697
광주광산경찰서 -17.473634
dtype: float64
관서명
광주지방경찰청계 -9.516087
광주동부경찰서 -13.007737
광주서부경찰서 -6.526208
광주남부경찰서 -17.050938
광주북부경찰서 -4.893925
광주광산경찰서 -12.285797
dtype: float64
s4.name = '2015-2016 증감률'
s5.name = '2016-2017 증감률'
s4
관서명
광주지방경찰청계 -18.130643
광주동부경찰서 -12.186837
광주서부경찰서 -17.542373
광주남부경찰서 -11.903637
광주북부경찰서 -24.112697
광주광산경찰서 -17.473634
Name: 2015-2016 증감률, dtype: float64
display(s4)
관서명
광주지방경찰청계 -18.130643
광주동부경찰서 -12.186837
광주서부경찰서 -17.542373
광주남부경찰서 -11.903637
광주북부경찰서 -24.112697
광주광산경찰서 -17.473634
Name: 2015-2016 증감률, dtype: float64
total = pd.concat([s1, s4, s2, s5, s3], axis=1)
total
2015총계 2015-2016 증감률 2016총계 2016-2017 증감률 2017총계
관서명
광주지방경찰청계 18830 -18.130643 15416 -9.516087 13949
광주동부경찰서 2355 -12.186837 2068 -13.007737 1799
광주서부경찰서 4720 -17.542373 3892 -6.526208 3638
광주남부경찰서 2117 -11.903637 1865 -17.050938 1547
광주북부경찰서 5466 -24.112697 4148 -4.893925 3945
광주광산경찰서 4172 -17.473634 3443 -12.285797 3020
import pandas as pd
list = [9904312, 3448737, 2890451, 266052]
city = ['서울', '부산', '인천', '대구']
population = pd.Series(list, index = city)
population
서울 9904312
부산 3448737
인천 2890451
대구 266052
dtype: int64
population.values
array([9904312, 3448737, 2890451, 266052], dtype=int64)
population.index
Index(['서울', '부산', '인천', '대구'], dtype='object')
population.dtype
dtype('int64')
population
population.index.name = '도시'
population
도시
서울 9904312
부산 3448737
인천 2890451
대구 266052
dtype: int64
population/1000000
도시
서울 9.904312
부산 3.448737
인천 2.890451
대구 0.266052
dtype: float64
population>=1000000
도시
서울 True
부산 True
인천 True
대구 False
dtype: bool
Series 인덱싱
population[0], population['서울']
(9904312, 9904312)
population
도시
서울 9904312
부산 3448737
인천 2890451
대구 266052
dtype: int64
#여러개 요소 인덱싱
population[[0,3,1]]
도시
서울 9904312
대구 266052
부산 3448737
dtype: int64
population[['서울','대구','부산']]
도시
서울 9904312
대구 266052
부산 3448737
dtype: int64
bol=population >=2500000
print(population[bol])
도시
서울 9904312
부산 3448737
인천 2890451
dtype: int64
bol1 = population >= 2500000
bol2 = population <= 5000000
population[bol]
도시
서울 9904312
부산 3448737
인천 2890451
dtype: int64
bol1 & bol2
도시
서울 False
부산 True
인천 True
대구 False
dtype: bool
population[bol1 & bol2]
도시
부산 3448737
인천 2890451
dtype: int64
population[1:3] #순서번호
도시
부산 3448737
인천 2890451
dtype: int64
population["부산":"대구"]
도시
부산 3448737
인천 2890451
대구 266052
dtype: int64
population['부산':'대구']
도시
부산 3448737
인천 2890451
대구 266052
dtype: int64
data = {"아구몬":9631482, "피요몬":3393197, "텐타몬":1490158, "가트몬":2632035}
digimon = pd.Series(data)
digimon
아구몬 9631482
피요몬 3393197
텐타몬 1490158
가트몬 2632035
dtype: int64
digimon.index
Index(['아구몬', '피요몬', '텐타몬', '가트몬'], dtype='object')
data2 = {"아구몬":9904312, "피요몬":3448737, "텐타몬":2466052, "니드몬":2890451}
digimon_levelup = pd.Series(data2)
digimon_levelup
아구몬 9904312
피요몬 3448737
텐타몬 2466052
니드몬 2890451
dtype: int64
attack = digimon_levelup - digimon #시리즈와 시리즈 연산 같은 인덱스를 가진 Value끼리 연산을 진행
bol = attack.notnull()
#notnull 비어있는 값(결측지)이면 False 그외 True
attack[bol]
아구몬 272830.0
텐타몬 975894.0
피요몬 55540.0
dtype: float64
#비어있는 데이터 확인
bol2 = attack.isnull()
attack[bol2]
가트몬 NaN
니드몬 NaN
dtype: float64
rp = (digimon_levelup - digimon)/digimon * 100
rp[rp.notnull()]
아구몬 2.832690
텐타몬 65.489297
피요몬 1.636804
dtype: float64
rp['아구몬'] = 1.6
rp['파닥몬'] = 5.5
# del rp['피요몬']
rp
가트몬 NaN
니드몬 NaN
아구몬 1.600000
텐타몬 65.489297
피요몬 1.636804
파닥몬 5.500000
dtype: float64
data = {"2015":[9904312,3448737,2894051,2466052],
"2010":[9631482,3393191,2632035,2431774]}
df = pd.DataFrame(data) #data, index = ""가능
df
2015 2010
0 9904312 9631482
1 3448737 3393191
2 2894051 2632035
3 2466052 2431774
df.index = ['서울', '부산', '인천', '대구']
df
2015 2010
서울 9904312 9631482
부산 3448737 3393191
인천 2894051 2632035
대구 2466052 2431774
list1 = [[9904312,3448737,2894051,2466052],
[9631482,3393191,2632035,2431774]]
list1
df2 = pd.DataFrame(list1, index=["2015","2010"], columns = ["서울", "부산", "인천","대구"])
df2
서울 부산 인천 대구
2015 9904312 3448737 2894051 2466052
2010 9631482 3393191 2632035 2431774
#데이터프레임.T : 전치(행과 열을 뒤집어줌)
df2.T
2015 2010
서울 9904312 9631482
부산 3448737 3393191
인천 2894051 2632035
대구 2466052 2431774
df.values
array([[9904312, 9631482],
[3448737, 3393191],
[2894051, 2632035],
[2466052, 2431774]], dtype=int64)
# dtype = object ->문자열
df.index
Index(['서울', '부산', '인천', '대구'], dtype='object')
df.columns
Index(['2015', '2010'], dtype='object')
#데이터프레임 [컬럼이름]
df["2015"]
df[['2015', '2010']]
2015 2010
서울 9904312 9631482
부산 3448737 3393191
인천 2894051 2632035
대구 2466052 2431774
df['2005'] = [9762546,3512547,2517680,2456016]
df
2015 2010 2005
서울 9904312 9631482 9762546
부산 3448737 3393191 3512547
인천 2894051 2632035 2517680
대구 2466052 2431774 2456016
#기본 인덱싱 [] 방법 -> 인덱스 :열인덱스
#기본 인덱싱 [] -> 슬라이싱 : 행인덱싱
df["서울":"인천"]
2015 2010 2005
서울 9904312 9631482 9762546
부산 3448737 3393191 3512547
인천 2894051 2632035 2517680
df["2015"]
서울 9904312
부산 3448737
인천 2894051
대구 2466052
Name: 2015, dtype: int64
#인덱서
#loc[] index를 통해 접근
#iloc[] 순서를 통해 접근
#loc[axis0, axis1]
df.loc["서울":"부산","2015":"2010"]
2015 2010
서울 9904312 9631482
부산 3448737 3393191
df.loc[:,:]
2015 2010 2005
서울 9904312 9631482 9762546
부산 3448737 3393191 3512547
인천 2894051 2632035 2517680
대구 2466052 2431774 2456016
df.iloc[:,1:3]
2010 2005
서울 9631482 9762546
부산 3393191 3512547
인천 2632035 2517680
대구 2431774 2456016
df[df>=2500000]
2015 2010 2005
서울 9904312.0 9631482.0 9762546.0
부산 3448737.0 3393191.0 3512547.0
인천 2894051.0 2632035.0 2517680.0
대구 NaN NaN NaN
df[df['2010']>=2500000]
2015 2010 2005
서울 9904312 9631482 9762546
부산 3448737 3393191 3512547
인천 2894051 2632035 2517680
CSV파일을 불러오기
#pd.read_csv('파일명')
population_number = pd.read_csv('data/population_number.csv',encoding = 'euc-kr', index_col= '도시')
population_number
지역 2015 2010 2005 2000
도시
서울 수도권 9904312 9631482.0 9762546.0 9853972
부산 경상권 3448737 NaN NaN 3655437
인천 수도권 2890451 2632035.0 NaN 2466338
대구 경상권 2466052 2431774.0 2456016.0 2473990
population_number.columns
Index(['지역', '2015', '2010', '2005', '2000'], dtype='object')
# 시리즈.value_count()
population_number['지역'].value_counts()
수도권 2
경상권 2
Name: 지역, dtype: int64
population_number.sort_index()
지역 2015 2010 2005 2000
도시
대구 경상권 2466052 2431774.0 2456016.0 2473990
부산 경상권 3448737 NaN NaN 3655437
서울 수도권 9904312 9631482.0 9762546.0 9853972
인천 수도권 2890451 2632035.0 NaN 2466338
population_number.sort_values('2015')
지역 2015 2010 2005 2000
도시
대구 경상권 2466052 2431774.0 2456016.0 2473990
인천 수도권 2890451 2632035.0 NaN 2466338
부산 경상권 3448737 NaN NaN 3655437
서울 수도권 9904312 9631482.0 9762546.0 9853972
population_number['2010'].sort_values(ascending=False)
#ascending 옵션 : True 일때 오름차순 정렬
도시
서울 9631482.0
인천 2632035.0
대구 2431774.0
부산 NaN
Name: 2010, dtype: float64
#여러개의 컴럼을 기준으로 정렬
population_number.sort_values(by=['지역','2010'], ascending=False)
지역 2015 2010 2005 2000
도시
서울 수도권 9904312 9631482.0 9762546.0 9853972
인천 수도권 2890451 2632035.0 NaN 2466338
대구 경상권 2466052 2431774.0 2456016.0 2473990
부산 경상권 3448737 NaN NaN 3655437
score = pd.read_csv('data/score.csv',encoding = 'euc-kr', index_col = "과목")
score
1반 2반 3반 4반
과목
파이썬 45 44 73 39
DB 76 92 45 69
자바 47 92 45 69
크롤링 92 81 85 40
Web 11 79 47 26
print(score.sum(axis=1).sort_values(ascending=False))
print()
print(score.sum(axis=0))
과목
크롤링 298
DB 282
자바 253
파이썬 201
Web 163
dtype: int64
1반 271
2반 388
3반 295
4반 243
dtype: int64
score['합계'] = score.loc[:,'1반':'4반'].sum(axis = 1)
score
1반 2반 3반 4반 합계
과목
파이썬 45 44 73 39 201
DB 76 92 45 69 282
자바 47 92 45 69 253
크롤링 92 81 85 40 298
Web 11 79 47 26 163
score['평균'] = score.iloc[:, 0:3].mean(axis = 1)
score
1반 2반 3반 4반 합계 평균
과목
파이썬 45 44 73 39 201 54.000000
DB 76 92 45 69 282 71.000000
자바 47 92 45 69 253 61.333333
크롤링 92 81 85 40 298 86.000000
Web 11 79 47 26 163 45.666667
# # 새로운 행이나 열을 만드는 방법
# axis = 0 행에대한 삭제
# axis = 1 열에대한 삭제
# # 만들고 싶은 행/열을 인덱싱 한 후 대입연사자를 통해
# # 값을 넣어주면됌
# score.loc['반평균'] = score.mean()
# score
1반 2반 3반 4반 합계 평균
과목
파이썬 45.0 44.0 73.0 39.0 201.0 54.000000
DB 76.0 92.0 45.0 69.0 282.0 71.000000
자바 47.0 92.0 45.0 69.0 253.0 61.333333
크롤링 92.0 81.0 85.0 40.0 298.0 86.000000
Web 11.0 79.0 47.0 26.0 163.0 45.666667
반평균 54.2 77.6 59.0 48.6 239.4 63.600000
# # score.drop('인덱스이름', axis = 1)
# score.drop('인덱스이름', axis = 1, inplace=True(디폴트값은 False 대체할것인가))
score.max(axis = 1)
과목
파이썬 201.0
DB 282.0
자바 253.0
크롤링 298.0
Web 163.0
반평균 239.4
dtype: float64
score.min(axis = 1)
과목
파이썬 39.0
DB 45.0
자바 45.0
크롤링 40.0
Web 11.0
반평균 48.6
dtype: float64
score.max()
1반 92.0
2반 92.0
3반 85.0
4반 69.0
합계 298.0
평균 86.0
dtype: float64
MaxArr = score.loc[:'Web',:'4반'].max(axis = 1)
MaxArr
과목
파이썬 73.0
DB 92.0
자바 92.0
크롤링 92.0
Web 79.0
dtype: float64
minArr = score.loc[:'Web', :'4반'].min(axis = 1)
minArr
과목
파이썬 39.0
DB 45.0
자바 45.0
크롤링 40.0
Web 11.0
dtype: float64
# # #df.apply(func, axis = 0 or 1)
# # 행이나 열 단위로 더 복잡한 처리를 하고 싶을 떄 사용
# # 판다스 객체에 다른 라이브러리 함수를 적용하는 방법
# # panda 열 혹은 행에 대해 함수를 적용하게 해주는 함수
# # def 함수명 (매개변수):
# 함수 코드
# return
#과목별 가장 큰값과 작은값을 구하시오
score.loc['파이썬'].max()
201.0
#apply용 함수 생성
def max_min(s):
dif = s.max() - s.min()
return dif
score.loc[:'Web',:'4반'].apply(max_min, axis = 1)
과목
파이썬 34.0
DB 47.0
자바 47.0
크롤링 52.0
Web 68.0
dtype: float64
#fillna()
population_number
지역 2015 2010 2005 2000
도시
서울 수도권 9904312 9631482.0 9762546.0 9853972
부산 경상권 3448737 NaN NaN 3655437
인천 수도권 2890451 2632035.0 NaN 2466338
대구 경상권 2466052 2431774.0 2456016.0 2473990
population_number.fillna(0, inplace=True)
population_number
지역 2015 2010 2005 2000
도시
서울 수도권 9904312 9631482.0 9762546.0 9853972
부산 경상권 3448737 0.0 0.0 3655437
인천 수도권 2890451 2632035.0 0.0 2466338
대구 경상권 2466052 2431774.0 2456016.0 2473990
카테고리 생성하기
ages = [0,2,10,21,23,37,31,61,20,41,32,100]
bins = [0,15,25,35,60,99]
label = ['미성년자', '청년','중년', '장년', '노년']
cats = pd.cut(ages, bins, labels=label, right=False) #앞에 어떤 데이터를 카테고리화 할 것 인가
#pd.cut(카테고리화를 진행할 데이터, 카테고리화를 진행할 범위, labels = 각 카테고리별 이름, right = 기본적으로 True 2번째 매개변수로 오른쪽 범위값을 포함하고 왼쪽은 포함하지 않음 )
cats
['미성년자', '미성년자', '미성년자', '청년', '청년', ..., '노년', '청년', '장년', '중년', NaN]
Length: 12
Categories (5, object): ['미성년자' < '청년' < '중년' < '장년' < '노년']
type(cats)
pandas.core.arrays.categorical.Categorical
agedf = pd.DataFrame(ages, columns=['ages'])
agedf
ages
0 0
1 2
2 10
3 21
4 23
5 37
6 31
7 61
8 20
9 41
10 32
11 100
agedf['age_cat'] = cats
agedf
ages age_cat
0 0 미성년자
1 2 미성년자
2 10 미성년자
3 21 청년
4 23 청년
5 37 장년
6 31 중년
7 61 노년
8 20 청년
9 41 장년
10 32 중년
11 100 NaN
df1 = pd.DataFrame({'A': ['A0', 'A1', 'A2', 'A3'],
'B': ['B0', 'B1', 'B2', 'B3'],
'C': ['C0', 'C1', 'C2', 'C3'],
'D': ['D0', 'D1', 'D2', 'D3']},
index=[0, 1, 2, 3])
df2 = pd.DataFrame({'A': ['A4', 'A5', 'A6', 'A7'],
'B': ['B4', 'B5', 'B6', 'B7'],
'C': ['C4', 'C5', 'C6', 'C7'],
'D': ['D4', 'D5', 'D6', 'D7']},
index=[4, 5, 6, 7])
df3 = pd.DataFrame({'A': ['A8', 'A9', 'A10', 'A11'],
'B': ['B8', 'B9', 'B10', 'B11'],
'C': ['C8', 'C9', 'C10', 'C11'],
'D': ['D8', 'D9', 'D10', 'D11']},
index=[8, 9, 10, 11])
display(df1)
display(df2)
display(df3)
A B C D
0 A0 B0 C0 D0
1 A1 B1 C1 D1
2 A2 B2 C2 D2
3 A3 B3 C3 D3
A B C D
4 A4 B4 C4 D4
5 A5 B5 C5 D5
6 A6 B6 C6 D6
7 A7 B7 C7 D7
A B C D
8 A8 B8 C8 D8
9 A9 B9 C9 D9
10 A10 B10 C10 D10
11 A11 B11 C11 D11
pd.concat([df1, df2, df3])
A B C D
0 A0 B0 C0 D0
1 A1 B1 C1 D1
2 A2 B2 C2 D2
3 A3 B3 C3 D3
4 A4 B4 C4 D4
5 A5 B5 C5 D5
6 A6 B6 C6 D6
7 A7 B7 C7 D7
8 A8 B8 C8 D8
9 A9 B9 C9 D9
10 A10 B10 C10 D10
11 A11 B11 C11 D11
result = pd.concat([df1, df2, df3], keys=['x','y','z'])
#concat시 key를 부여하면 다중 index가 된다.
A B C D
x 0 A0 B0 C0 D0
1 A1 B1 C1 D1
2 A2 B2 C2 D2
3 A3 B3 C3 D3
y 4 A4 B4 C4 D4
5 A5 B5 C5 D5
6 A6 B6 C6 D6
7 A7 B7 C7 D7
z 8 A8 B8 C8 D8
9 A9 B9 C9 D9
10 A10 B10 C10 D10
11 A11 B11 C11 D11
result.index
MultiIndex([('x', 0),
('x', 1),
('x', 2),
('x', 3),
('y', 4),
('y', 5),
('y', 6),
('y', 7),
('z', 8),
('z', 9),
('z', 10),
('z', 11)],
)
#멀티인덱싱에대해 접근하기 위해선 튜플로 멀티인덱스를 사용하여 접근한다.
result.loc[('y',5 )]
A A5
B B5
C C5
D D5
Name: (y, 5), dtype: object
df4 = pd.DataFrame({'B': ['B2', 'B3', 'B6', 'B7'],
'D': ['D2', 'D3', 'D6', 'D7'],
'F': ['F2', 'F3', 'F6', 'F7']},
index=[2, 3, 6, 7])
df4
B D F
2 B2 D2 F2
3 B3 D3 F3
6 B6 D6 F6
7 B7 D7 F7
result = pd.concat([df1,df4],axis = 1)
result
A B C D B D F
0 A0 B0 C0 D0 NaN NaN NaN
1 A1 B1 C1 D1 NaN NaN NaN
2 A2 B2 C2 D2 B2 D2 F2
3 A3 B3 C3 D3 B3 D3 F3
6 NaN NaN NaN NaN B6 D6 F6
7 NaN NaN NaN NaN B7 D7 F7
pd.concat([df1,df4], axis = 1, join='inner')
A B C D B D F
2 A2 B2 C2 D2 B2 D2 F2
3 A3 B3 C3 D3 B3 D3 F3
pd.concat([df1, df4], ignore_index = True)
A B C D F
0 A0 B0 C0 D0 NaN
1 A1 B1 C1 D1 NaN
2 A2 B2 C2 D2 NaN
3 A3 B3 C3 D3 NaN
4 NaN B2 NaN D2 F2
5 NaN B3 NaN D3 F3
6 NaN B6 NaN D6 F6
7 NaN B7 NaN D7 F7
#concat() 인덱스/컬럼에 영향을 받아 dataframe 병합
#merge() 값 기준으로 병합
df5 = pd.DataFrame({'key' : ['K0','K2','K3','K4'],
'A':['A0','A1','A2','A3'],
'B':['B0','B1','B2','B3']})
df6 = pd.DataFrame({'key' : ['K0','K1','K2','K3'],
'C':['C0','C1','C2','C3'],
'D':['D0','D1','D2','D3']})
display(pd.merge(df5, df6, on= 'key'))
pd.merge(df5, df6, on='key', how='outer')
key A B C D
0 K0 A0 B0 C0 D0
1 K2 A1 B1 C2 D2
2 K3 A2 B2 C3 D3
key A B C D
0 K0 A0 B0 C0 D0
1 K2 A1 B1 C2 D2
2 K3 A2 B2 C3 D3
3 K4 A3 B3 NaN NaN
4 K1 NaN NaN C1 D1
pd.merge(df5, df6, on='key', how='left')
key A B C D
0 K0 A0 B0 C0 D0
1 K2 A1 B1 C2 D2
2 K3 A2 B2 C3 D3
3 K4 A3 B3 NaN NaN
pd.merge(df5, df6, on='key', how='right')
key A B C D
0 K0 A0 B0 C0 D0
1 K1 NaN NaN C1 D1
2 K2 A1 B1 C2 D2
3 K3 A2 B2 C3 D3
df2015 = pd.read_csv("data/2015.csv", encoding = 'euc-kr', index_col = "관서명")
df2016 = pd.read_csv("data/2016.csv", encoding = 'euc-kr', index_col = "관서명")
df2017 = pd.read_csv("data/2017.csv", encoding = 'euc-kr', index_col = "관서명")
display(df2015.head(3))
display(df2016.head(3))
display(df2017.head(3))
구분 살인 강도 강간·강제추행 절도 폭력
관서명
광주지방경찰청계 발생건수 18 44 750 8425 9593
광주지방경찰청계 검거건수 18 47 758 5409 8301
광주지방경찰청계 검거인원 17 66 776 3433 11774
구분 살인 강도 강간·강제추행 절도 폭력
관서명
광주지방경찰청계 발생건수 17 47 701 6052 8599
광주지방경찰청계 검거건수 18 47 713 4242 7631
광주지방경찰청계 검거인원 21 54 758 3455 10747
구분 살인 강도 강간·강제추행 절도 폭력
관서명
광주지방경찰청계 발생건수 9 33 725 4816 8366
광주지방경찰청계 검거건수 9 32 732 3487 7553
광주지방경찰청계 검거인원 10 61 824 3046 11018
#데이터 프레임 info()
df2015.info()
<class 'pandas.core.frame.DataFrame'>
Index: 36 entries, 광주지방경찰청계 to 광주광산경찰서
Data columns (total 6 columns):
# Column Non-Null Count Dtype
--- ------ -------------- -----
0 구분 36 non-null object
1 살인 36 non-null int64
2 강도 36 non-null int64
3 강간·강제추행 36 non-null int64
4 절도 36 non-null int64
5 폭력 36 non-null int64
dtypes: int64(5), object(1)
memory usage: 2.0+ KB
df2016.info()
<class 'pandas.core.frame.DataFrame'>
Index: 36 entries, 광주지방경찰청계 to 광주광산경찰서
Data columns (total 6 columns):
# Column Non-Null Count Dtype
--- ------ -------------- -----
0 구분 36 non-null object
1 살인 36 non-null int64
2 강도 36 non-null int64
3 강간·강제추행 36 non-null int64
4 절도 36 non-null int64
5 폭력 36 non-null int64
dtypes: int64(5), object(1)
memory usage: 2.0+ KB
df2017.info()
<class 'pandas.core.frame.DataFrame'>
Index: 42 entries, 광주지방경찰청계 to 광주광산경찰서
Data columns (total 6 columns):
# Column Non-Null Count Dtype
--- ------ -------------- -----
0 구분 42 non-null object
1 살인 42 non-null int64
2 강도 42 non-null int64
3 강간·강제추행 42 non-null int64
4 절도 42 non-null int64
5 폭력 42 non-null int64
dtypes: int64(5), object(1)
memory usage: 2.3+ KB
df2017.index.unique()
Index(['광주지방경찰청계', '광주지방경찰청', '광주동부경찰서', '광주서부경찰서', '광주남부경찰서', '광주북부경찰서',
'광주광산경찰서'],
dtype='object', name='관서명')
print(df2015.index.unique())
print(df2017.index.unique())
Index(['광주지방경찰청계', '광주동부경찰서', '광주서부경찰서', '광주남부경찰서', '광주북부경찰서', '광주광산경찰서'], dtype='object', name='관서명')
Index(['광주지방경찰청계', '광주지방경찰청', '광주동부경찰서', '광주서부경찰서', '광주남부경찰서', '광주북부경찰서',
'광주광산경찰서'],
dtype='object', name='관서명')
#drop 함수는 실행한다고 해서 바로 반영 x
df2017 = df2017.drop('광주지방경찰청', axis=0)
df2015['총계'] = df2015.loc[: ,'살인':'폭력'].sum(axis = 1)
display(df2015.head(3))
구분 살인 강도 강간·강제추행 절도 폭력 총계
관서명
광주지방경찰청계 발생건수 18 44 750 8425 9593 18830
광주지방경찰청계 검거건수 18 47 758 5409 8301 14533
광주지방경찰청계 검거인원 17 66 776 3433 11774 16066
df2016['총계'] = df2016.loc[: ,'살인':'폭력'].sum(axis = 1)
display(df2016.head(3))
구분 살인 강도 강간·강제추행 절도 폭력 총계
관서명
광주지방경찰청계 발생건수 17 47 701 6052 8599 15416
광주지방경찰청계 검거건수 18 47 713 4242 7631 12651
광주지방경찰청계 검거인원 21 54 758 3455 10747 15035
df2017['총계'] = df2017.loc[: ,'살인':'폭력'].sum(axis = 1)
display(df2017.head(3))
<ipython-input-235-08220ea226e4>:1: SettingWithCopyWarning:
A value is trying to be set on a copy of a slice from a DataFrame.
Try using .loc[row_indexer,col_indexer] = value instead
See the caveats in the documentation: https://pandas.pydata.org/pandas-docs/stable/user_guide/indexing.html#returning-a-view-versus-a-copy
df2017['총계'] = df2017.loc[: ,'살인':'폭력'].sum(axis = 1)
구분 살인 강도 강간·강제추행 절도 폭력 총계
관서명
광주지방경찰청계 발생건수 9 33 725 4816 8366 13949
광주지방경찰청계 검거건수 9 32 732 3487 7553 11813
광주지방경찰청계 검거인원 10 61 824 3046 11018 14959
s1 = df2015[df2015['구분'] =='발생건수'].loc[:,'총계']
s1.name = '2015총계'
s1
관서명
광주지방경찰청계 18830
광주동부경찰서 2355
광주서부경찰서 4720
광주남부경찰서 2117
광주북부경찰서 5466
광주광산경찰서 4172
Name: 2015총계, dtype: int64
s2 = df2016[df2016['구분'] =='발생건수'].loc[:,'총계']
s2.name = '2016총계'
s2
관서명
광주지방경찰청계 15416
광주동부경찰서 2068
광주서부경찰서 3892
광주남부경찰서 1865
광주북부경찰서 4148
광주광산경찰서 3443
Name: 2016총계, dtype: int64
s3 = df2017[df2017['구분'] =='발생건수'].loc[:,'총계']
s3.name = '2017총계'
s3
관서명
광주지방경찰청계 13949
광주동부경찰서 1799
광주서부경찰서 3638
광주남부경찰서 1547
광주북부경찰서 3945
광주광산경찰서 3020
Name: 2017총계, dtype: int64
# 2016- 2015년도 범죄증감률 s4
# 2017-2016년도 범죄증감률 s5
s4=(s2-s1)/s1*100
s5=(s3-s2)/s2*100
display(s4)
display(s5)
관서명
광주지방경찰청계 -18.130643
광주동부경찰서 -12.186837
광주서부경찰서 -17.542373
광주남부경찰서 -11.903637
광주북부경찰서 -24.112697
광주광산경찰서 -17.473634
dtype: float64
관서명
광주지방경찰청계 -9.516087
광주동부경찰서 -13.007737
광주서부경찰서 -6.526208
광주남부경찰서 -17.050938
광주북부경찰서 -4.893925
광주광산경찰서 -12.285797
dtype: float64
s4.name = '2015-2016 증감률'
s5.name = '2016-2017 증감률'
s4
관서명
광주지방경찰청계 -18.130643
광주동부경찰서 -12.186837
광주서부경찰서 -17.542373
광주남부경찰서 -11.903637
광주북부경찰서 -24.112697
광주광산경찰서 -17.473634
Name: 2015-2016 증감률, dtype: float64
display(s4)
관서명
광주지방경찰청계 -18.130643
광주동부경찰서 -12.186837
광주서부경찰서 -17.542373
광주남부경찰서 -11.903637
광주북부경찰서 -24.112697
광주광산경찰서 -17.473634
Name: 2015-2016 증감률, dtype: float64
total = pd.concat([s1, s4, s2, s5, s3], axis=1)
total
2015총계 2015-2016 증감률 2016총계 2016-2017 증감률 2017총계
관서명
광주지방경찰청계 18830 -18.130643 15416 -9.516087 13949
광주동부경찰서 2355 -12.186837 2068 -13.007737 1799
광주서부경찰서 4720 -17.542373 3892 -6.526208 3638
광주남부경찰서 2117 -11.903637 1865 -17.050938 1547
광주북부경찰서 5466 -24.112697 4148 -4.893925 3945
광주광산경찰서 4172 -17.473634 3443 -12.285797 3020