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
'개발일지 > Pandas' 카테고리의 다른 글
pandas 판다스 기초11 slice, upper, lower, title등 Series의 경우에 작동하는 문법 (0) | 2022.07.25 |
---|---|
pandas 틀린부분 복기 4 (0) | 2022.07.23 |
pandas 판다스 틀린부분 복기3 (0) | 2022.07.19 |
pandas 판다스 기초 11 체인인덱싱(chain indexing) 피하기, copy, 올바른 값 변경해주기 (0) | 2022.07.19 |
pandas 판다스 틀린부분 복기2 (0) | 2022.07.18 |