스마트 인재개발원/Python 기초

2021-04-12 파이썬 라이브러리(스마트인재개발원)

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