엑셀의 내용을 자유롭게 만질 수 있다.
.py
파일보다 IDE 을 사용하는 것이 편하다.
참고. [Python 완전정복 시리즈] 2편
터미널에서
pip install pandas
입력 후 pandas 설치
파이썬 아이들에서import pandas as pd
로 정의
>>> data = {'name' : ['Mark', 'Jane', 'Chris', 'Ryan'],
'age' : [33,42,44,42],
'score' : [91.3, 83.4, 77.5, 87.7]}
>>> df = pd.DataFrame(data)
>>> df
name age score
0 Mark 33 91.3
1 Jane 42 83.4
2 Chris 44 77.5
3 Ryan 42 87.7
>>> df.sum()
name MarkJaneChrisRyan
age 161
score 339.9
dtype: object
아래 루트로 가서 엑셀 파일 참고.
mybox -> 공부 -> 공학공부 -> 서비스로봇 -> 수업 -> python -> 기초문법 -> 1121
중요 문법
df = pd.read_csv('apt.csv', encoding='cp949')
: csv 파일 변수에 저장.
os.chdir(r'C:\Users\GIEC\Desktop\기초문법\1121')
: 저장된 엑셀 파일의 위치로 이동.
>>> os.chdir(r'C:\Users\GIEC\Desktop\기초문법\1121') #저장된 엑셀 파일의 위치로 이동
>>> os.getcwd() #위치 확인
'C:\\Users\\GIEC\\Desktop\\기초문법\\1121'
>>> df = pd.read_csv('apt.csv', encoding='cp949') #csv 파일인 경우 csv를 붙여준다. cp949 윈도우전용 엔코딩 번호
>>> len(df) #제목을 뺀 총 로우 확인
42758
>>> df.head() #처음 5개의 데이터만 보여 줌.
지역 번지 본번 부번 아파트 ... 계약일 가격 층 건축년도 도로명
0 강원도 강릉시 견소동 202 202 0 송정한신 ... 4 10900 5 1997 경강로2539번길 8
1 강원도 강릉시 견소동 202 202 0 송정한신 ... 31 18500 10 1997 경강로2539번길 8
2 강원도 강릉시 견소동 289 289 0 송정해변신도브래뉴아파트 ... 5 25000 6 2005 경강로2539번길 22
3 강원도 강릉시 견소동 289 289 0 송정해변신도브래뉴아파트 ... 12 20600 3 2005 경강로2539번길 22
4 강원도 강릉시 견소동 289 289 0 송정해변신도브래뉴아파트 ... 20 20500 1 2005 경강로2539번길 22
[5 rows x 12 columns]
>>> df.tail() #끝에서 5개의 데이터만 보여 줌.
지역 번지 본번 부번 ... 가격 층 건축년도 도로명
42753 충청북도 충주시 호암동 547-6 547 6 ... 7000 3 1994 신촌2길 28
42754 충청북도 충주시 호암동 221-23 221 23 ... 12000 15 2002 원호암5길 32
42755 충청북도 충주시 호암동 221-23 221 23 ... 11000 7 2002 원호암5길 32
42756 충청북도 충주시 호암동 221-23 221 23 ... 12000 14 2002 원호암5길 32
42757 충청북도 충주시 호암동 221-23 221 23 ... 11200 11 2002 원호암5길 32
[5 rows x 12 columns]
>>> df.지역 #열의 제목으로도 가져올 수 있다.
0 강원도 강릉시 견소동
1 강원도 강릉시 견소동
2 강원도 강릉시 견소동
3 강원도 강릉시 견소동
4 강원도 강릉시 견소동
...
42753 충청북도 충주시 호암동
42754 충청북도 충주시 호암동
42755 충청북도 충주시 호암동
42756 충청북도 충주시 호암동
42757 충청북도 충주시 호암동
Name: 지역, Length: 42758, dtype: object
>>> df.면적 > 130 #boolean
0 False
1 False
2 False
3 False
4 False
...
42753 False
42754 False
42755 False
42756 False
42757 False
Name: 면적, Length: 42758, dtype: bool
>>> df[df.면적 > 130] #boolean을 내용으로 바꾸려면
지역 번지 본번 부번 ... 가격 층 건축년도 도로명
6 강원도 강릉시 교동 1982 1982 0 ... 34300 9 2009 화부산로99번길 12
39 강원도 강릉시 남문동 183-2 183 2 ... 21000 12 1992 홍제로 7-17
334 강원도 속초시 금호동 629 629 0 ... 29500 1 2008 영랑호반길 115-13
433 강원도 원주시 개운동 01월 28일 28 1 ... 26000 16 2006 행구로 54
434 강원도 원주시 개운동 01월 28일 28 1 ... 24000 14 2006 행구로 54
... ... ... ... .. ... ... .. ... ...
42595 충청북도 충주시 문화동 2260 2260 0 ... 15000 3 1993 중원대로 3379
42607 충청북도 충주시 안림동 1166 1166 0 ... 18500 12 2007 국원초1길 48
42663 충청북도 충주시 연수동 1627 1627 0 ... 31500 13 2007 연수동산로 26
42736 충청북도 충주시 칠금동 626 626 0 ... 18500 12 1996 금릉로 17
42737 충청북도 충주시 칠금동 626 626 0 ... 16200 3 1996 금릉로 17
[1567 rows x 12 columns]
>>> df.가격[df.면적 > 130]
6 34300
39 21000
334 29500
433 26000
434 24000
...
42595 15000
42607 18500
42663 31500
42736 18500
42737 16200
Name: 가격, Length: 1567, dtype: int64
>>> df.지역[(df.면적 > 130) & (df.가격 < 150000) ] #조건을 두 개로 만들 때. &만 가능, and 불가.
6 강원도 강릉시 교동
39 강원도 강릉시 남문동
334 강원도 속초시 금호동
433 강원도 원주시 개운동
434 강원도 원주시 개운동
...
42595 충청북도 충주시 문화동
42607 충청북도 충주시 안림동
42663 충청북도 충주시 연수동
42736 충청북도 충주시 칠금동
42737 충청북도 충주시 칠금동
Name: 지역, Length: 1473, dtype: object
>>> df.지역[(df.면적 > 130) | (df.가격 < 150000) ] #OR
0 강원도 강릉시 견소동
1 강원도 강릉시 견소동
2 강원도 강릉시 견소동
3 강원도 강릉시 견소동
4 강원도 강릉시 견소동
...
42753 충청북도 충주시 호암동
42754 충청북도 충주시 호암동
42755 충청북도 충주시 호암동
42756 충청북도 충주시 호암동
42757 충청북도 충주시 호암동
Name: 지역, Length: 42581, dtype: object
>>> df.loc[:10, ['아파트', '가격']]
아파트 가격
0 송정한신 10900
1 송정한신 18500
2 송정해변신도브래뉴아파트 25000
3 송정해변신도브래뉴아파트 20600
4 송정해변신도브래뉴아파트 20500
5 강릉 교동 풍림아이원 아파트 29200
6 강릉교동롯데캐슬1단지 34300
7 강릉교동롯데캐슬2단지 32500
8 교동1주공 16200
9 교동1주공 21550
10 교동1주공 21800
# 인덱싱 + 조건문, 조건문은 뒤에 붙여준다.
df.loc[: , ['아파트', '가격']][df.가격 > 40000]
아파트 가격
382 속초청호아이파크 45800
541 무실e-편한세상 44600
592 원주반곡아이파크 40700
842 온의 롯데캐슬 스카이클래스 44000
843 온의 롯데캐슬 스카이클래스 42900
... ... ...
42364 신영지웰시티 1차 47700
42365 신영지웰시티 1차 46000
42366 신영지웰시티 1차 55800
42367 신영지웰시티 1차 67000
42424 봉명아이파크 49000
[10486 rows x 2 columns]
엑셀에는 값이 생성되지 않음.
>>> df['단가'] = df.가격 / df.면적 #단가라는 값은 없는데 내가 직접 만듦.
>>> df.loc[:10, ('가격', '면적', '단가')]
가격 면적 단가
0 10900 59.8000 182.274247
1 18500 116.1750 159.242522
2 25000 84.9900 294.152253
3 20600 84.9900 242.381457
4 20500 84.9900 241.204848
5 29200 84.9964 343.543962
6 34300 135.1727 253.749463
7 32500 118.0686 275.263703
8 16200 59.8900 270.495909
9 21550 84.8400 254.007544
10 21800 84.8400 256.954267
#오름차순
>>> df.sort_values(by = '가격')
지역 번지 본번 부번 ... 층 건축년도 도로명 단가
17024 경상북도 구미시 원평동 937-68 937 68 ... 4 1984 칠성로2길 16 14.880952
17022 경상북도 구미시 원평동 937-68 937 68 ... 3 1984 칠성로2길 15 14.221861
17637 경상북도 칠곡군 약목면 관호리 산74-10 74 10 ... 6 1990 관호8길 32-2 23.719165
17031 경상북도 구미시 원평동 937-68 937 68 ... 2 1984 칠성로2길 16 19.841270
17027 경상북도 구미시 원평동 937-68 937 68 ... 3 1984 칠성로2길 16 19.841270
... ... ... ... .. ... .. ... ... ...
27036 서울특별시 강남구 대치동 670 670 0 ... 3 2005 선릉로 206 2310.026630
26805 부산광역시 해운대구 우동 1407 1407 0 ... 70 2011 마린시티2로 33 1794.949512
29946 서울특별시 서초구 반포동 02월 12일 2 12 ... 8 2016 신반포로15길 19 3194.273399
27061 서울특별시 강남구 도곡동 202 202 0 ... 2 2018 남부순환로373길 23 2190.023753
31258 서울특별시 용산구 한남동 810 810 0 ... 4 2011 독서당로 111 2080.991324
>>> df[df.가격 > 40000].sort_values(by='면적').loc[ : , ('면적', '가격', '지역')] #인덱싱을 사용할 수 있다.
면적 가격 지역
30111 25.3284 90000 서울특별시 성동구 성수동1가
27124 28.2460 74000 서울특별시 강남구 역삼동
27122 28.2460 74500 서울특별시 강남구 역삼동
27123 28.2460 76000 서울특별시 강남구 역삼동
29725 30.0100 43500 서울특별시 마포구 아현동
... ... ... ...
27118 242.8200 245000 서울특별시 강남구 역삼동
30002 244.4200 206000 서울특별시 서초구 서초동
10106 244.6630 100000 경기도 용인수지구 성복동
31501 273.8200 240000 서울특별시 중구 신당동
35826 291.3360 300000 인천광역시 연수구 송도동
[10486 rows x 3 columns]
#내림차순
>>> df.sort_values(by = '가격', ascending=False).loc[ : , ('가격', '지역')] #인덱싱을 사용할 수 있다.
가격 지역
31258 485000 서울특별시 용산구 한남동
27061 461000 서울특별시 강남구 도곡동
29946 415000 서울특별시 서초구 반포동
26805 376640 부산광역시 해운대구 우동
27036 373000 서울특별시 강남구 대치동
... ... ...
17027 800 경상북도 구미시 원평동
17025 800 경상북도 구미시 원평동
17637 750 경상북도 칠곡군 약목면 관호리
17022 700 경상북도 구미시 원평동
17024 600 경상북도 구미시 원평동
[42758 rows x 2 columns]
>>> df.지역.str.find('강릉') #인덱스로 반환
0 4
1 4
2 4
3 4
4 4
..
42753 -1
42754 -1
42755 -1
42756 -1
42757 -1
Name: 지역, Length: 42758, dtype: int64
>>> df[df.지역.str.find('야음') > -1] #df[ ]와 조건을 사용하여 관련된 내용만 불러올 수 있다.
지역 번지 본번 부번 ... 층 건축년도 도로명 단가
32479 울산광역시 남구 야음동 695-36 695 36 ... 3 2006 수암로149번길 9 279.961878
32480 울산광역시 남구 야음동 911 911 0 ... 6 2018 야음로26번길 34 626.529899
32481 울산광역시 남구 야음동 911 911 0 ... 29 2018 야음로26번길 34 636.687339
32482 울산광역시 남구 야음동 911 911 0 ... 27 2018 야음로26번길 34 571.884669
32483 울산광역시 남구 야음동 911 911 0 ... 4 2018 야음로26번길 34 626.529899
... ... ... ... .. ... .. ... ... ...
32608 울산광역시 남구 야음동 538-1 538 1 ... 11 1993 꽃대나리로46번길 7 208.556787
32609 울산광역시 남구 야음동 538-1 538 1 ... 2 1993 꽃대나리로46번길 7 176.767677
32610 울산광역시 남구 야음동 730-6 730 6 ... 5 1991 신남로 8-17 202.721047
32611 울산광역시 남구 야음동 730-6 730 6 ... 11 1991 신남로 8-17 221.332705
32612 울산광역시 남구 야음동 730-6 730 6 ... 10 1991 신남로 8-17 210.327626
[134 rows x 13 columns]
셀에 글자가 있는 경우 전체 평균은 구할 수 없어 한 개의 열씩 구해야 함.
중요문법
dft.가격.mean()
한 개 열의 평균 구하기.
>>> dft = df[df.지역.str.find('야음') > -1] #특정 조건에 맞는 값을 새로 저장
>>> dft['가격'].mean() #가격에 대한 평균 구함.
33552.985074626864
>>> dft.가격.mean() #괄호에 넣지 않아도 가능.
33552.985074626864
평균은 전체를 더한 값에 개수를 나누는 거지만 중앙값은 1, 2, 3 에서 2 딱 중앙에 있는 값을 의미한다.
>>> df2.income.median()
4999.0
>>> df2.describe()
income English jobSatisfaction stress
count 23.000000 23.000000 23.000000 23.000000
mean 4304.217391 608.695652 3.304348 3.347826
std 1019.478341 99.603959 1.258960 1.433644
min 3000.000000 500.000000 1.000000 1.000000
25% 3000.000000 500.000000 2.500000 2.000000
50% 4999.000000 600.000000 3.000000 4.000000
75% 5000.000000 700.000000 4.000000 5.000000
max 6000.000000 800.000000 5.000000 5.000000
>>> df2.sex.value_counts()
sex
m 14
f 9
Name: count, dtype: int64
중요문법
df2.groupby(df2.sex).mean()
groupby에 조건을 부여 후 계산값(평균 등등)을 구할 수 있다.df2.groupby(df2.sex).mean() income English jobSatisfaction stress sex f 4333.111111 633.333333 3.666667 3.111111 m 4285.642857 592.857143 3.071429 3.500000