- titanic 데이터셋(sns.load_dataset('titanic')) 에서 ['age','sex', 'class', 'fare', 'survived'] 5개 열을 선택해서 df를 만드세요.
- class 열을 기준으로 분할하고 각 그룹에 대한 모든 열의 표준편차를 집계하여 df로 반환하세요.
- 최대값과 최소값의 차를 계산하는 사용자 정의 함수(minmax) 를 만들고 각 그룹의 최대값과 최소값의 차리를 계산하여 그룹별로 집계해 보세요.
- 각 열에 2개 함수(min, max)함수를 일괄 적용해 보세요.
- fare 열에는 min, max 함수를, age 열에는 mean 함수를 적용해 보세요.
- age 열의 평균이 30보다 작은 그룹만을 필터링하여 데이터프레임으로 반환하세요
In [1]:
import pandas as pd
import numpy as np
import seaborn as sns
import warnings
warnings.simplefilter(action="ignore", category = FutureWarning)
In [2]:
df = sns.load_dataset('titanic')
df.head()
Out[2]:
survived | pclass | sex | age | sibsp | parch | fare | embarked | class | who | adult_male | deck | embark_town | alive | alone | |
---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|
0 | 0 | 3 | male | 22.0 | 1 | 0 | 7.2500 | S | Third | man | True | NaN | Southampton | no | False |
1 | 1 | 1 | female | 38.0 | 1 | 0 | 71.2833 | C | First | woman | False | C | Cherbourg | yes | False |
2 | 1 | 3 | female | 26.0 | 0 | 0 | 7.9250 | S | Third | woman | False | NaN | Southampton | yes | True |
3 | 1 | 1 | female | 35.0 | 1 | 0 | 53.1000 | S | First | woman | False | C | Southampton | yes | False |
4 | 0 | 3 | male | 35.0 | 0 | 0 | 8.0500 | S | Third | man | True | NaN | Southampton | no | True |
In [3]:
# 1번
df1 = df[['age','sex','class','fare','survived']]
df1
Out[3]:
age | sex | class | fare | survived | |
---|---|---|---|---|---|
0 | 22.0 | male | Third | 7.2500 | 0 |
1 | 38.0 | female | First | 71.2833 | 1 |
2 | 26.0 | female | Third | 7.9250 | 1 |
3 | 35.0 | female | First | 53.1000 | 1 |
4 | 35.0 | male | Third | 8.0500 | 0 |
... | ... | ... | ... | ... | ... |
886 | 27.0 | male | Second | 13.0000 | 0 |
887 | 19.0 | female | First | 30.0000 | 1 |
888 | NaN | female | Third | 23.4500 | 0 |
889 | 26.0 | male | First | 30.0000 | 1 |
890 | 32.0 | male | Third | 7.7500 | 0 |
891 rows × 5 columns
In [4]:
df2 = df1.groupby('class').agg(np.std).reset_index()
df2
Out[4]:
class | age | fare | survived | |
---|---|---|---|---|
0 | First | 14.802856 | 78.380373 | 0.484026 |
1 | Second | 14.001077 | 13.417399 | 0.500623 |
2 | Third | 12.495398 | 11.778142 | 0.428949 |
In [5]:
def cal_min_max(x):
return x.max() - x.min()
In [6]:
df3 = df1.groupby('class').agg(cal_min_max)
df3
Out[6]:
age | fare | survived | |
---|---|---|---|
class | |||
First | 79.08 | 512.3292 | 1 |
Second | 69.33 | 73.5000 | 1 |
Third | 73.58 | 69.5500 | 1 |
In [7]:
df4 = df1.groupby('class').agg(['min', 'max'])
df4
Out[7]:
age | sex | fare | survived | |||||
---|---|---|---|---|---|---|---|---|
min | max | min | max | min | max | min | max | |
class | ||||||||
First | 0.92 | 80.0 | female | male | 0.0 | 512.3292 | 0 | 1 |
Second | 0.67 | 70.0 | female | male | 0.0 | 73.5000 | 0 | 1 |
Third | 0.42 | 74.0 | female | male | 0.0 | 69.5500 | 0 | 1 |
In [8]:
df5 = df1.groupby('class').agg({
"fare":['min', 'max'],
"age":['mean']})
df5
Out[8]:
fare | age | ||
---|---|---|---|
min | max | mean | |
class | |||
First | 0.0 | 512.3292 | 38.233441 |
Second | 0.0 | 73.5000 | 29.877630 |
Third | 0.0 | 69.5500 | 25.140620 |
In [9]:
df6 = df1.groupby('class').filter(lambda x: x['age'].mean() < 30)
df6.tail()
Out[9]:
age | sex | class | fare | survived | |
---|---|---|---|---|---|
884 | 25.0 | male | Third | 7.050 | 0 |
885 | 39.0 | female | Third | 29.125 | 0 |
886 | 27.0 | male | Second | 13.000 | 0 |
888 | NaN | female | Third | 23.450 | 0 |
890 | 32.0 | male | Third | 7.750 | 0 |
반응형
'데이터분석' 카테고리의 다른 글
[23.06.20] SQL - 13(1) (0) | 2023.06.20 |
---|---|
[23.06.19] Python time series - 12(3) (0) | 2023.06.19 |
[23.06.19] Python groupby, aggregate, transform, filter - 12(1) (0) | 2023.06.19 |
[23.06.16] Python apply, 문제 - 11(4) (0) | 2023.06.16 |
[23.06.16] Python pivot_table - 11(2) (0) | 2023.06.16 |