Series 데이터 개수 세기
- count() 메서드 = 개수를 세주는데~ NaN 값은 세지 않는다. 누락된 부분(NaN)을 찾을 때 유용하다.
- DataFrame에 count()메서드를 사용하면 각 열마다 데이터 개수를 세고, Series로 반환한다.
s = pd.Series(range(10))
s[3] = np.nan
print('count : ',s.count(),'\\nlen : ',len(s),end ='\\n\\n') # len은 길이만.
s
- 데이터 시각화 수업에 배울 seaborn 패키지에 titanic호의 승객 데이터도 있다.
- 아래 예제처럼 DataFrame으로 읽어올 수 있다.
import seaborn as sns
titanic = sns.load_dataset('titanic')
titanic.count()
Series 카테고리 값 세기
- Series 값이 정수, 문자열,카테고리 값인 경우에는 value_counts() 메서드로
- value_counts의 인자 중 normalize = True 하면 상대분포로 값을 준다.
- 각각의 값이 나온 횟수를 셀 수 있다.
np.random.seed(1)
s2 = pd.Series(np.random.randint(6,size=100))
s2.value_counts()
np.random.seed(2)
df = pd.DataFrame(np.random.randint(5,size=(4,4)),dtype=float)
df.iloc[2,3] = np.nan
print(df[0].value_counts())
df
DataFrame 값 세기
- DataFrame에서도 value_counts 메서드가 사용 가능하고 column값을 넣어주면 된다.
- 단 column label이 있어야 한다. (default로 들어가는 정수형 index의 경우 작동 안 함.)
- 하지만 NaN값이 있는 row는 개수로 안 친다.
# df.value_counts(1) # 에러나는 구문
df = pd.DataFrame(np.arange(4*4).reshape(4,4))
print(df.value_counts([0,1]))
df = pd.DataFrame(np.arange(4*4).reshape(4,4),columns=list('ABCD'))
print(df)
print(df.value_counts('A'))
print(df.value_counts(['A','B','C']))
Series 정렬
- index 기준 = sort_index()
- value 기준 = sort_values() - NaN값이 있을 때 NaN값이 가장 뒤에 위치하게 됨.
- 큰 수에서 작은 수로 가는 내림차순으로 변경하기 위해 사용하는 인자는 ascending = False이다.
- ascending = False를 해도 NaN은 가장 뒤에 온다.
print(s2.value_counts())
print(s2.value_counts().sort_index())
print(s2.value_counts().sort_values())
Data Frame정렬
- DataFrame에서 sort_values 메서드를 사용하려면 by 키워드 인수를
- 활용하여 DataFrame의 정렬 기준이 되는 column을 지정해 주어야 한다.
- by키워드 값으로 여러 개를 넣어주면 각 1번째 기준으로 정렬 후 다음에 오는 놈 기준으로 정렬한다.
print(df)
df.sort_values
print(titanic['sex'].value_counts())
print(titanic['age'].value_counts().sort_values(ascending= False))
print(titanic['class'].value_counts())
print(titanic['alive'].value_counts())
DataFrame 행/열 합계
- sum(axis)
- axis 인수에는 합계로 인해 없어지는 방향축(0=row , 1 = column)을 지정한다.
- row의 집계를 구할 때는 sum(axis=1) 메서드를 사용합니다.
- 그냥 sum() 은 axis=0일 때 값을 구한다.
DataFrame 행/열 평균
- sum과 사용법이 같은 mean() 메서드를 사용하면 된다.
np.random.seed(1)
df2 = pd.DataFrame(np.random.randint(10 ,size = (4,8)))
print(df2)
print(df2.sum(axis=1))
df2['Rowsum'] = df2.sum(axis=1)
print(df2)df2.loc['ColTotal2'] = df2.sum()
df2
- 0 1 2 3 4 5 6 7 Rowsum
0 | 5 | 8 | 9 | 5 | 0 | 0 | 1 | 7 | 35 |
1 | 6 | 9 | 2 | 4 | 5 | 2 | 4 | 2 | 34 |
2 | 4 | 7 | 7 | 9 | 1 | 7 | 0 | 6 | 41 |
3 | 9 | 9 | 7 | 6 | 9 | 1 | 0 | 1 | 42 |
ColTotal2 | 24 | 33 | 25 | 24 | 15 | 10 | 5 | 16 | 152 |
del df2[7]df2.loc['ColTotal'] = df2.mean()df2
- 0 1 2 3 4 5 6 Rowsum
0 | 5.0 | 8.0 | 9.0 | 5.0 | 0.0 | 0.0 | 1.0 | 35.0 |
1 | 6.0 | 9.0 | 2.0 | 4.0 | 5.0 | 2.0 | 4.0 | 34.0 |
2 | 4.0 | 7.0 | 7.0 | 9.0 | 1.0 | 7.0 | 0.0 | 41.0 |
3 | 9.0 | 9.0 | 7.0 | 6.0 | 9.0 | 1.0 | 0.0 | 42.0 |
ColTotal2 | 24.0 | 33.0 | 25.0 | 24.0 | 15.0 | 10.0 | 5.0 | 152.0 |
ColTotal | 9.6 | 13.2 | 10.0 | 9.6 | 6.0 | 4.0 | 2.0 | 60.8 |
#연습문제1
titanic.loc[titanic.pclass ==1]
- survived pclass sex age sibsp parch fare embarked class who adult_male deck embark_town alive alone
1 | 1 | 1 | female | 38.0 | 1 | 0 | 71.2833 | C | First | woman | False | C | Cherbourg | yes | False |
3 | 1 | 1 | female | 35.0 | 1 | 0 | 53.1000 | S | First | woman | False | C | Southampton | yes | False |
6 | 0 | 1 | male | 54.0 | 0 | 0 | 51.8625 | S | First | man | True | E | Southampton | no | True |
11 | 1 | 1 | female | 58.0 | 0 | 0 | 26.5500 | S | First | woman | False | C | Southampton | yes | True |
23 | 1 | 1 | male | 28.0 | 0 | 0 | 35.5000 | S | First | man | True | A | Southampton | yes | True |
… | … | … | … | … | … | … | … | … | … | … | … | … | … | … | … |
871 | 1 | 1 | female | 47.0 | 1 | 1 | 52.5542 | S | First | woman | False | D | Southampton | yes | False |
872 | 0 | 1 | male | 33.0 | 0 | 0 | 5.0000 | S | First | man | True | B | Southampton | no | True |
879 | 1 | 1 | female | 56.0 | 0 | 1 | 83.1583 | C | First | woman | False | C | Cherbourg | yes | False |
887 | 1 | 1 | female | 19.0 | 0 | 0 | 30.0000 | S | First | woman | False | B | Southampton | yes | True |
889 | 1 | 1 | male | 26.0 | 0 | 0 | 30.0000 | C | First | man | True | C | Cherbourg | yes | True |
216 rows × 15 columns
# 연습문제 2
round(titanic['age'].mean(),1) # 나이평균구하기
29.7
#연습문제3
female_age_mean = titanic[titanic.sex =='female']['age'].mean() # 여자 나이평균 구하기
round(female_age_mean,1)
29.7
# 연습문제4
#여자 이고, pclass가 1인 사람들의 나이 평균 구하기
#내코드
pclass = titanic[titanic.pclass == 1]
round(pclass[pclass.sex=='female']['age'].mean(),1)
#선생님 코드
round(titanic[(titanic['pclass']==1) & (titanic['sex'] == 'female')]['age'].mean(),1)
# True False bool type 을 구하는 연산들에 대해 &연산을 추가해 조건들을 중첩해 줄 수 있다.
#zeus 코드
titanic.loc[titanic.pclass == 1].loc[titanic.sex == "female"]["age"].mean()
34.61176470588235
DataFrame apply() 메서드
- 함수를 모든 값에 적용하는 함수
- 첫 인자로 함수를 필수 값으로 받는다
- 경우에 따라서 두 번째 인자로 axis를 받는다.
- axis default= 0
- axis = 0 or ‘index’ 이면 각 column에 적용된다.
- axis = 1 or ‘comuns’ 이면 각 row에 적용된다.
import pandas as pd
df = pd.DataFrame([[4,9]]*3, columns=['A','B'])
df
print(df.apply(np.sqrt))
np.sqrt(df) # 둘은 같은 값이다.
print(df)#axis가 0 일때 각 column 별 집계한다.
df.apply(np.sum, axis=0)
#axis가 1 일떄 각 row 별 집계한다.
df.apply(np.sum,axis=1)
- 함수의 return이 column마다 리스트를 반환하면 DataFrame의 결과를 얻을 수 있다.
- 함수의 return이 row마다 리스트를 반환하면 각 row마다 리스트를 하나의 값으로 취급하는 Series 타입의 결과가 나온다
- result_type = ‘expand’을 설정하면 DataFrame 타입으로 묶어서 나올 수 있다.
- result_Type = ‘broadcast’를 인수로 전달하면 동일한 shape의 결과를 보장한다.
- 함수로부터 반환되는 게 리스트인지 스칼라인지에 상관없이 axis방향으로 브로드캐스트 한다.
- 결과의 column label은 본래의 것을 유지한다.
- broadcast를 인수로 전달할 때 함수로부터 return 된 값이 기존 shape으로 broadcast 할 수 없는 shape이라면
- ValueError가 발생한다.
print(df.apply(lambda x: [1,2], axis=0)) # DataFrame타입의 결과
print(df.apply(lambda x : [1,2],axis=1)) # Series타입의 결과
print(df.apply(lambda x: [1,2],axis=1,result_type='expand'))
print(df.apply(lambda x : [1,2],axis=1,result_type = 'broadcast'))
column마다의 최댓값과 최솟값의 차이를 구하고 싶으면 다음과 같은 람다 사용
df3 = pd.DataFrame({
'A' : [1,2,3,4,3],
'B' : [1,6,5,4,3],
'C' : [1,5,2,4,4]
})
df3
print(df3.apply(lambda x:x.max()-x.min()))
print(df3.apply(lambda x:x.max()-x.min(),axis=1))
print(df3.apply(pd.value_counts)) # 개수 파악하는 함수
#연습문제1
titanic['adult/child'] = titanic.apply(lambda r : 'adult' if r.age>=20 else "child",axis=1)
titanic.tail()
survived pclass sex age sibsp parch fare embarked class who adult_male deck embark_town alive alone adult/child
886 | 0 | 2 | male | 27.0 | 0 | 0 | 13.00 | S | Second | man | True | NaN | Southampton | no | True | adult |
887 | 1 | 1 | female | 19.0 | 0 | 0 | 30.00 | S | First | woman | False | B | Southampton | yes | True | child |
888 | 0 | 3 | female | NaN | 1 | 2 | 23.45 | S | Third | woman | False | NaN | Southampton | no | False | child |
889 | 1 | 1 | male | 26.0 | 0 | 0 | 30.00 | C | First | man | True | C | Cherbourg | yes | True | adult |
890 | 0 | 3 | male | 32.0 | 0 | 0 | 7.75 | Q | Third | man | True | NaN | Queenstown | no | True | adult |
#연습문제2
titanic['category1'] = titanic.apply(lambda r : r.sex if r.age>20 else 'child',axis=1)
titanic.tail(10)
survived pclass sex age sibsp parch fare embarked class who adult_male deck embark_town alive alone adult/child category1
881 | 0 | 3 | male | 33.0 | 0 | 0 | 7.8958 | S | Third | man | True | NaN | Southampton | no | True | adult | male |
882 | 0 | 3 | female | 22.0 | 0 | 0 | 10.5167 | S | Third | woman | False | NaN | Southampton | no | True | adult | female |
883 | 0 | 2 | male | 28.0 | 0 | 0 | 10.5000 | S | Second | man | True | NaN | Southampton | no | True | adult | male |
884 | 0 | 3 | male | 25.0 | 0 | 0 | 7.0500 | S | Third | man | True | NaN | Southampton | no | True | adult | male |
885 | 0 | 3 | female | 39.0 | 0 | 5 | 29.1250 | Q | Third | woman | False | NaN | Queenstown | no | False | adult | female |
886 | 0 | 2 | male | 27.0 | 0 | 0 | 13.0000 | S | Second | man | True | NaN | Southampton | no | True | adult | male |
887 | 1 | 1 | female | 19.0 | 0 | 0 | 30.0000 | S | First | woman | False | B | Southampton | yes | True | child | child |
888 | 0 | 3 | female | NaN | 1 | 2 | 23.4500 | S | Third | woman | False | NaN | Southampton | no | False | child | child |
889 | 1 | 1 | male | 26.0 | 0 | 0 | 30.0000 | C | First | man | True | C | Cherbourg | yes | True | adult | male |
890 | 0 | 3 | male | 32.0 | 0 | 0 | 7.7500 | Q | Third | man | True | NaN | Queenstown | no | True | adult | male |
'파이썬 > Pandas' 카테고리의 다른 글
6. Pandas 추가 메서드 - 3 (0) | 2023.05.02 |
---|---|
5.Pandas 추가 메서드 - 2 (0) | 2023.05.02 |
3.Pandas - DataFrame - 2 (1) | 2023.05.02 |
2.Pandas - DataFrame - 1 (0) | 2023.05.02 |
1. Pandas Series (0) | 2023.05.02 |