본문 바로가기
개발일지/Pandas

pandas 판다스 rank, unique, nunique, count, 평균, 표준편차(mean, std), 상관계수 corr

by 다니엘의 개발 이야기 2022. 7. 23.
320x100
## Sorting DataFrame (Version 1.0 Updte)
import pandas as pd
titanic = pd.read_csv('titanic.csv')

titanic.age.sort_values()

'''
803    0.42
755    0.67
644    0.75
469    0.75
78     0.83
       ... 
859     NaN
863     NaN
868     NaN
878     NaN
888     NaN
Name: age, Length: 891, dtype: float64
'''
titanic.sort_values(by = 'age')

'''
	survived	pclass	sex	age	sibsp	parch	fare	embarked	deck
803	1	3	male	0.42	0	1	8.5167	C	NaN
755	1	2	male	0.67	1	1	14.5000	S	NaN
644	1	3	female	0.75	2	1	19.2583	C	NaN
469	1	3	female	0.75	2	1	19.2583	C	NaN
78	1	2	male	0.83	0	2	29.0000	S	NaN
...	...	...	...	...	...	...	...	...	...
859	0	3	male	NaN	0	0	7.2292	C	NaN
863	0	3	female	NaN	8	2	69.5500	S	NaN
868	0	3	male	NaN	0	0	9.5000	S	NaN
878	0	3	male	NaN	0	0	7.8958	S	NaN
888	0	3	female	NaN	1	2	23.4500	S	NaN
891 rows × 9 columns
'''
titanic.sort_values(by = 'age', ascending=True)
# titanic을 출력했을때 원래는 head, tail, rows * columns 정보로 이루어져있다.
# rows의 제한을 900개로 풀어주는 것이다.
# 그리고 rows * columns 정보는 표기되지 않는다.
# 기본 rows의 max 값은 10개로써 head 5개, tail 5개로 이루어 진다.
# 출력해서 기록해야 할 값이 많을때 유용하다.

pd.options.display.max_rows = 900
titanic.sort_index(ascending=True)
titanic.sort_values(by = ['pclass', 'sex', 'age'], ascending= True, inplace=True)
titanic

'''
	survived	pclass	sex	age	sibsp	parch	fare	embarked	deck
297	0	1	female	2.0	1	2	151.5500	S	C
435	1	1	female	14.0	1	2	120.0000	S	B
...	...	...	...	...	...	...	...	...	...
868	0	3	male	NaN	0	0	9.5000	S	NaN
878	0	3	male	NaN	0	0	7.8958	S	NaN
'''
# 바로 전의 값에 대해서 인덱스가 뒤죽박죽 되어있다.
# 그 인덱스를 기준으로 정렬해준다.
# 당연하게도, 전에 정렬기준으로 썼던 'pclass, sex, age'가 이번엔 뒤죽박죽이 된다.
titanic.sort_index(ascending=True, inplace = True)
titanic

'''
survived	pclass	sex	age	sibsp	parch	fare	embarked	deck
0	0	3	male	22.0	1	0	7.2500	S	NaN
1	1	1	female	38.0	1	0	71.2833	C	C
...	...	...	...	...	...	...	...	...	...
889	1	1	male	26.0	0	0	30.0000	C	C
890	0	3	male	32.0	0	0	7.7500	Q	NaN
891 rows × 9 columns
'''
# 이것은 위의 것들을 보완해 주는 방식이다.
# 어떤 컬럼 값을 기준으로 정렬을 해주되, 그냥 정렬을 해주면 인덱스값이 지저분 해진다.
# 이때, 새로 정렬된 값을 기준으로 인덱스 초기화를 해준다.
# drop = True를 해주고 안해주고의 차이는 안해줄경우 변형되었던 뒤죽박죽 된 인덱스가, 새로 정렬된 인덱스 바로 옆에 나온다.
# 그것을 방지해주기 위해서 drop = True를 써주는 것이다.

titanic.sort_values(by = 'age').reset_index(drop=True)

'''

survived	pclass	sex	age	sibsp	parch	fare	embarked	deck
0	1	3	male	0.42	0	1	8.5167	C	NaN
1	1	2	male	0.67	1	1	14.5000	S	NaN
...	...	...	...	...	...	...	...	...	...
889	0	3	male	NaN	0	0	7.8958	S	NaN
890	0	3	female	NaN	1	2	23.4500	S	NaN
'''
titanic.sort_values(by = 'age',ignore_index=True)

# 이것도 reset_index(drop=True)와 같은 기능을 한다.
# 다만 문법에 차이가 있으니 유의하자.

'''
survived	pclass	sex	age	sibsp	parch	fare	embarked	deck
0	1	3	male	0.42	0	1	8.5167	C	NaN
1	1	2	male	0.67	1	1	14.5000	S	NaN
...	...	...	...	...	...	...	...	...	...
889	0	3	male	NaN	0	0	7.8958	S	NaN
890	0	3	female	NaN	1	2	23.4500	S	NaN
'''


## Ranking DataFrame with rank()

import pandas as pd
sales = pd.Series([15,32,45,21,55,15,0], index = ['Mo', 'Tue', 'Wed', 'Thu', 'Fri', 'Sat', 'Sun'])
sales

'''
Mo     15
Tue    32
       ..
Sat    15
Sun     0
Length: 7, dtype: int64
'''
sales.rank()

'''
Mo     2.5
Tue    5.0
      ... 
Sat    2.5
Sun    1.0
Length: 7, dtype: float64
'''

# 순위가 겹치는 경우에 순위.겹치는만큼 나누어짐
# 이를테면 이번케이스에서는 2위가 2번이였기 때문에 2.5로 표기된다.
# sunday가 1위로써, 1위가 가장 안좋은거다. rank 함수에서는
sales.rank().sort_values(ascending=True)

'''
Sun    1.0
Mo     2.5
      ... 
Wed    6.0
Fri    7.0
Length: 7, dtype: float64
'''
sales.rank()
'''
Mo     2.5
Tue    5.0
Wed    6.0
Thu    4.0
Fri    7.0
Sat    2.5
Sun    1.0
dtype: float64
'''

# 기본적으로 ascending =True로 설정되어있다.
sales.rank(ascending=False)

'''
Mo     5.5
Tue    3.0
Wed    2.0
Thu    4.0
Fri    1.0
Sat    5.5
Sun    7.0
dtype: float64
'''

# ascending 가 True일때도 무슨기준으로 정렬이 된건지 잘 모르겠었는데
# False일때도 딱히 어떻게 정렬이 된건지는 잘 모르겠다.
sales.rank(method = 'min')
'''
Mo     2.0
Tue    5.0
Wed    6.0
Thu    4.0
Fri    7.0
Sat    2.0
Sun    1.0
dtype: float64
'''

# method 값으로는 기본적으로 average가 설정되어있다.
# 하지만 이것을 최소값인 min으로 전환해준다면 그저, 해당 랭크값에 해당되는게 두번 나오는 것이다.
# 이것 외에도 method 설정이 가능한 값은 약 6개정도 있다. 설명 창에 나와있다.
# pct는 랭크에 따른 백분율 값이다.
# 따라서 1위는 1로만 나오는 거고,
# 그 외의 값은 얼마나 랭크가 있는지, 몇위인지에 따라서 비율 계산되서 표현된다.

sales.rank(pct = True)
# 기본값으로는 pct 값이 False이다.

'''
Mo     0.357143
Tue    0.714286
Wed    0.857143
Thu    0.571429
Fri    1.000000
Sat    0.357143
Sun    0.142857
dtype: float64
'''
titanic = pd.read_csv('titanic.csv')
titanic.fare.rank()
'''
0       77.0
1      789.0
2      232.5
3      748.0
4      264.0
       ...  
886    407.5
887    654.5
888    546.5
889    654.5
890    123.5
Name: fare, Length: 891, dtype: float64
'''
titanic['fare_rank'] = titanic.fare.rank(ascending=True, method = 'min')
titanic.head()
titanic.sort_values('fare', ascending=False)
titanic.drop(columns= 'fare_rank', inplace = True)


## nunique(), nlargest() and nsmallest() with DataFrames

import pandas as pd
titanic = pd.read_csv('titanic.csv')

titanic.age.unique()

'''
array([22.  , 38.  , 26.  , 35.  ,   nan, 54.  ,  2.  , 27.  , 14.  ,
        4.  , 58.  , 20.  , 39.  , 55.  , 31.  , 34.  , 15.  , 28.  ,
        8.  , 19.  , 40.  , 66.  , 42.  , 21.  , 18.  ,  3.  ,  7.  ,
       49.  , 29.  , 65.  , 28.5 ,  5.  , 11.  , 45.  , 17.  , 32.  ,
       16.  , 25.  ,  0.83, 30.  , 33.  , 23.  , 24.  , 46.  , 59.  ,
       71.  , 37.  , 47.  , 14.5 , 70.5 , 32.5 , 12.  ,  9.  , 36.5 ,
       51.  , 55.5 , 40.5 , 44.  ,  1.  , 61.  , 56.  , 50.  , 36.  ,
       45.5 , 20.5 , 62.  , 41.  , 52.  , 63.  , 23.5 ,  0.92, 43.  ,
       60.  , 10.  , 64.  , 13.  , 48.  ,  0.75, 53.  , 57.  , 80.  ,
       70.  , 24.5 ,  6.  ,  0.67, 30.5 ,  0.42, 34.5 , 74.  ])
'''
# 각 열의 고유값의 수를 표시
titanic.nunique(axis = 0)


'''
survived는 0과 1 즉, 생존 혹은 죽음으로만 이루어져 있기 때문에 2
survived      2

pclass는 승객의 구분을 0,1,2 이렇게 3개이기 때문에 3
pclass        3

sex           2
age          88
sibsp         7
parch         7
fare        248
embarked      3
deck          7
dtype: int64
'''

# 그러고보면 nunique()는 numeric unique 의 약자 같다. 아니면 number of unique()
# 기본적으로 dropna = True로 설정이 되어있다.
# 결측치는 drop 한다는 의미다.

# 즉, 결측값 까지 카운트 하려면 dropna = False로 해주면 된다.
titanic.nunique(axis = 0, dropna = False)

'''
survived      2
pclass        3
sex           2
age          89
sibsp         7
parch         7
fare        248
embarked      4
deck          8
dtype: int64
'''

# 모든 값은 아니더라도, 차이가 있는 컬럼이 있다.
# fare는 티켓 프라이스다.
# nlargest는 n값만큼 가장 큰 n개의 값을 보여준다. (rank라고 생각하면 됨)


titanic.nlargest(n = 5, columns= 'fare')

'''
    survived	pclass	sex	age	sibsp	parch	fare	embarked	deck
258	1	1	female	35.0	0	0	512.3292	C	NaN
679	1	1	male	36.0	0	1	512.3292	C	B
737	1	1	male	35.0	0	0	512.3292	C	B
27	0	1	male	19.0	3	2	263.0000	S	C
88	1	1	female	23.0	3	2	263.0000	S	C
'''
# nsmallest는 n값만큼 가장 작은 n개의 값을 보여준다. (reverse rank라고 생각하면됨)

# titanic.nsmallest(n =4, columns='sex')
# TypeError: Column 'sex' has dtype object, cannot use method 'nsmallest' with this dtype
# 기본값으론 n의 숫자를 입력, 컬럼 값을 입력해야하며
# 반드시 columns로 사용이 될 컬럼 값은 object가 아닌 숫자계열인 int나 float여야 한다.
# 랭크를 계산해야하기 때문이다.

titanic.nsmallest(n =4, columns='age')
# 가장 작은 값이 있는 인덱스값을 리턴
# titanic.age.idxmin()

# 가장 작은 값이 있는 리턴된 인덱스 값을 이용하여 해당 인덱스의 필드값을 리턴
titanic.loc[titanic.age.idxmin()]

'''
survived         1
pclass           3
sex           male
age           0.42
sibsp            0
parch            1
fare        8.5167
embarked         C
deck           NaN
Name: 803, dtype: object
'''


## Summary Statistics and Accumulations
- summary statistics는 요약 통계
- accumulations statistics는 누적 통계

import pandas as pd
titanic = pd.read_csv('titanic.csv')
titanic.describe()

'''
    survived	pclass	age	sibsp	parch	fare
count	891.000000	891.000000	714.000000	891.000000	891.000000	891.000000
mean	0.383838	2.308642	29.699118	0.523008	0.381594	32.204208
std	0.486592	0.836071	14.526497	1.102743	0.806057	49.693429
min	0.000000	1.000000	0.420000	0.000000	0.000000	0.000000
25%	0.000000	2.000000	20.125000	0.000000	0.000000	7.910400
50%	0.000000	3.000000	28.000000	0.000000	0.000000	14.454200
75%	1.000000	3.000000	38.000000	1.000000	0.000000	31.000000
max	1.000000	3.000000	80.000000	8.000000	6.000000	512.329200
'''
# axis = 0은 열값을 기준으로
# count는 몇개인지 세어주라.
titanic.count(axis=0)

'''
survived    891
pclass      891
sex         891
age         714
sibsp       891
parch       891
fare        891
embarked    889
deck        203
dtype: int64
'''

# 갯수가 최대값인 891에서 차이가 난다는건 그만큼 결측치가 있다는 뜻이다.
# 기본적으로 cumsum()안에는 axis = 0 즉, 열 값을 기준으로
# "누적 합계"를 구하는 것이다.

# 일례로 행 index 0 값은 7.25
# 행 index 1 값은 71.2833 이다.
titanic.fare.cumsum()

'''
0          7.2500
1         78.5333
2         86.4583
3        139.5583
4        147.6083
          ...    
886    28602.7493
887    28632.7493
888    28656.1993
889    28686.1993
890    28693.9493
Name: fare, Length: 891, dtype: float64
'''
# 열과 행의 상관계수를 구하는 것
# 그래서 보면 행의 survived와 열의 survived가 만나는 포인트 값은 1.0이다.

titanic.corr()

'''
	survived	pclass	age	sibsp	parch	fare
survived	1.000000	-0.338481	-0.077221	-0.035322	0.081629	0.257307
pclass	-0.338481	1.000000	-0.369226	0.083081	0.018443	-0.549500
age	-0.077221	-0.369226	1.000000	-0.308247	-0.189119	0.096067
sibsp	-0.035322	0.083081	-0.308247	1.000000	0.414838	0.159651
parch	0.081629	0.018443	-0.189119	0.414838	1.000000	0.216225
fare	0.257307	-0.549500	0.096067	0.159651	0.216225	1.000000
'''

# + 값이 1에 가까울 수록 양의 상관계수를 가지며,
# - 값이 -1에 가까울 수록 음의 상관계수를 가진다.
# 0에 가까울 수록 상관관계가 없는 것이다.
# pandas Series로 상관관계를 별도 지정해주는 방법도 있다.
titanic.survived.corr(titanic.pclass)
#-0.3384810359610148


## The egg() method

import pandas as pd
titanic = pd.read_csv('titanic.csv')
titanic.mean()
'''
survived     0.383838
pclass       2.308642
              ...    
parch        0.381594
fare        32.204208
Length: 6, dtype: float64
'''
# 평균
titanic.agg('mean')

# titanic.mean()
# 과 같은 결과 값이 나온다.
'''
survived     0.383838
pclass       2.308642
              ...    
parch        0.381594
fare        32.204208
Length: 6, dtype: float64
'''
# 열의 평균과 표준 편차
# 열에서 행을 기준으로 하고싶으면 axis = 1을 해주면 된다.

titanic.agg(['mean', 'std'])

'''

        survived	pclass	age	sibsp	parch	fare
mean	0.383838	2.308642	29.699118	0.523008	0.381594	32.204208
std	0.486592	0.836071	14.526497	1.102743	0.806057	49.693429
'''
titanic.agg({'survived':'mean', 'age':['min', 'max']})

'''
    survived	age
mean	0.383838	NaN
min	NaN	0.42
max	NaN	80.00
'''
300x250