PY | Pandas, 통계

Stellar·2023년 11월 21일
0

Python

목록 보기
36/36
post-custom-banner

pandas, 통계

엑셀의 내용을 자유롭게 만질 수 있다. .py 파일보다 IDE 을 사용하는 것이 편하다.
참고. [Python 완전정복 시리즈] 2편

1. 설치

터미널에서 pip install pandas 입력 후 pandas 설치
파이썬 아이들에서 import pandas as pd로 정의

2. 데이터 정의하기

>>> 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

3. 엑셀 활용 내용 추려내기

아래 루트로 가서 엑셀 파일 참고.
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   신촌228
42754  충청북도 충주시 호암동  221-23  221  23  ...  12000  15  2002  원호암532
42755  충청북도 충주시 호암동  221-23  221  23  ...  11000   7  2002  원호암532
42756  충청북도 충주시 호암동  221-23  221  23  ...  12000  14  2002  원호암532
42757  충청북도 충주시 호암동  221-23  221  23  ...  11200  11  2002  원호암532

[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     강원도 원주시 개운동  012828   1  ...  26000  16  2006        행구로 54
434     강원도 원주시 개운동  012828   1  ...  24000  14  2006        행구로 54
...             ...      ...   ...  ..  ...    ...  ..   ...           ...
42595  충청북도 충주시 문화동     2260  2260   0  ...  15000   3  1993     중원대로 3379
42607  충청북도 충주시 안림동     1166  1166   0  ...  18500  12  2007      국원초148
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       신영지웰시티 147700
42365       신영지웰시티 146000
42366       신영지웰시티 155800
42367       신영지웰시티 167000
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      칠성로216    14.880952
17022      경상북도 구미시 원평동   937-68   937  68  ...   3  1984      칠성로215    14.221861
17637  경상북도 칠곡군 약목면 관호리   산74-10    74  10  ...   6  1990     관호832-2    23.719165
17031      경상북도 구미시 원평동   937-68   937  68  ...   2  1984      칠성로216    19.841270
17027      경상북도 구미시 원평동   937-68   937  68  ...   3  1984      칠성로216    19.841270
...                 ...      ...   ...  ..  ...  ..   ...           ...          ...
27036     서울특별시 강남구 대치동      670   670   0  ...   3  2005       선릉로 206  2310.026630
26805     부산광역시 해운대구 우동     1407  1407   0  ...  70  2011     마린시티233  1794.949512
29946     서울특별시 서초구 반포동  02122  12  ...   8  2016    신반포로1519  3194.273399
27061     서울특별시 강남구 도곡동      202   202   0  ...   2  2018  남부순환로37323  2190.023753
31258     서울특별시 용산구 한남동      810   810   0  ...   4  2011      독서당로 111  2080.991324

>>> df[df.가격 > 40000].sort_values(by='면적').loc[ : , ('면적', '가격', '지역')] #인덱싱을 사용할 수 있다.
             면적      가격               지역
30111   25.3284   90000  서울특별시 성동구 성수동127124   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]

✔️ find(), 문자 찾기

>>> 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]

✔️ mean(), 평균 구하기

셀에 글자가 있는 경우 전체 평균은 구할 수 없어 한 개의 열씩 구해야 함.
중요문법
dft.가격.mean() 한 개 열의 평균 구하기.

>>> dft = df[df.지역.str.find('야음') > -1] #특정 조건에 맞는 값을 새로 저장

>>> dft['가격'].mean() #가격에 대한 평균 구함.
33552.985074626864

>>> dft.가격.mean() #괄호에 넣지 않아도 가능.
33552.985074626864

✔️ median(), 중앙값 구하기

평균은 전체를 더한 값에 개수를 나누는 거지만 중앙값은 1, 2, 3 에서 2 딱 중앙에 있는 값을 의미한다.

>>> df2.income.median()
4999.0

✔️ describe(), 데이터 요약

>>> 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

✔️ value_counts(), 해당 열의 갯수 세기.

>>> df2.sex.value_counts()
sex
m   14
f     9
Name: count, dtype: int64

✔️ groupby(), 그룹으로 묶어 계산하기.

중요문법
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
post-custom-banner

0개의 댓글