1. 그룹별 수치 상위 N개 불러오기

groupby함수와 apply함수 이용하기

groupby : 데이터프레임에서 특정 열을 기준으로 데이터를 묶음

우선 새로 정의해서 특정 열을 기준으로 수치를 내림차순하는 함수를 만든다.

그 전에 데이터프레임을 예시로 만들자면 아래와 같다. 이름, 키, 점수의 변수를 만들어 이름별 상위 점수를 구하고자한다.

import pandas as pd
df = pd.DataFrame({'name':['lee','lee','park','park'],
                  'height':[160,155,190,170],
                  'score':[23,66,44,78]})
df
name height score
lee 160 23
lee 155 66
park 190 44
park 170 78

이름별 상위 점수 1개를 추출하기 위해서 함수를 지정한다.

def func(df,column='score',n=1):
    return df.sort_values(by='score',ascending=False)[:n]

여기서 n=1을 지정해 1개만 뽑고 sort_values를 이용해 숫자를 나열한다.
여기서 ascending=False는 오름차순 말고 내림차순을 하라는 의미이다.
그래서 상위 점수 내림차순해 맨 위에 1개를 추출할 수 있게 된다.

  • Point : 이 함수를 apply에 적용하여 데이터프레임에 적용이 가능
df.groupby('name').apply(func)

이름을 그룹핑해서 이름별 상위 점수 1개를 뽑았다.
그에 따른 결과는 다음과 같다.

  name height score
name      
lee lee 155 66
park park 170 78

2. 결측치가 아닌 행만 불러오기

notnull, isnull함수를 이용하기

notnull : Series에서 결측값이 아니면 True, 맞으면 False Boolean값을 나타냄 isnull : notnull과 반대로 결측치이면 True, 아니면 False값을 나타냄

새로운 데이터프레임 예시를 들자면 아래와 같습니다.

df = pd.DataFrame({'name':['lee','lee','park','park'],
                  'height':[160,np.nan,190,170],
                  'score':[23,66,44,np.nan]})
df
name height score
lee 160 23
lee NaN 66
park 190 NaN
park 170 78

여기서 결측치가 있는 행을 제외한 데이터프레임만 조회하고자 한다.

그 때 사용할 수 있는 함수가 notnull이다.

mask = (df['score'].notnull()) & (df['height'].notnull())
df[mask]

mask를 이용해서 score와 height열에 있는 결측치 값의 행을 제거한 데이터프레임을 도출했다.
반대로 결측치값만 조회하고자한다면 isnull을 사용하면 된다.

name height score
lee 160 23
park 170 78

결과는 위와 같다. 완벽히 결측치행들이 제거됨을 볼 수 있다.
하지만 더 간단한 방법으로 결측치가 있는 모든 행들을 제거할 수 있다.
그것은 dropna함수를 사용하면 된다.

df.dropna()
name height score
lee 160 23
park 170 78

dropna함수를 사용하면 위에 notnull을 사용했듯이 같은 결과값을 나타낼 수 있다.
다만 차이라고 한다면 notnull은 원하는 열만 부분적으로 뽑아낼 수 있고 dropna는 열에 상관없이 모든 열의 결측치가 든 행을 제거한다는 점이다.

3. 정규표현식을 사용해 문자열에서 숫자만 추출하기

re모듈 함수 findall 이용하기

findall : 문자열에서 특정문구,부호,숫자등을 찾아서 모두 불러오는 함수

이 문제를 해결하기 위해 임의로 만든 데이터프레임이다.

df = pd.DataFrame({'x':['11ab','aa44','cdd1f'],
                  'y':[1,2,3]})
df
x y
11ab 1
aa44 2
cdd1f 3

여기서 x열의 문자열에서 숫자만 추출해보자.

df['x'].apply(lambda x : re.findall('\d+',x)[0])

변수 x에만 함수를 적용해서 구하면 되기 때문에 apply와 lambda를 사용한다.
re.findall(‘\d+’,x)부분에서 \d+부분은 정수가 1개이상 나열된 것을 불러와라는 의미이다.

그리고 모든 정수값을 []리스트로 값이 나열되어 나온다.
그 중 첫 번째로 나온 정수값을 고르기위해 뒤에 [0]을 붙여주었다.

[Output]
0 11
1 44
2 1 

위와 같은 결과값이 나온다.