본문 바로가기
Programming/Python

[Pandas] Function application

df.copy()   <- 기존 데이터 그대로 복사하는 구문

Ex)

df = pd.read_csv('data/scores.csv')
df = df.head()
df_copy = df.copy()

df_copy.head()    # df.head()와 동일한 결과 출력

 

 

컬럼의 데이터 변경 (' ' 표시 없이 직관적으로 입력 可)

Ex) math 컬럼에 대해서

 

 

df_copy.math = df.math+5     #df['math']의 모든 점수에 일괄적 5점 더하기.(--> 105점 오류 有)
df_copy

 

그렇기에 100점을 넘지 않으면서 모두를 5점 더하는 조건의 함수를 적용해야 한다.  df['이름'].apply(함수) 사용!

def plus5(x):
    score = x+5        # 5점 더하는데
    if score>=100:     # 100점 이상인 경우 조건 설정
        score=100
    return score       # 반환값은 score!

df_copy['math'] = df['math'].apply(plus5)
df_copy

함수에 더할 점수도 변수로 둔다면, 다음과 같이 한다.

def plusn(x,n):  # 모든 점수에 n점 더하기. 100점이 넘을 수 없다.
    score = x+n
    if score>=100:
        score=100
    return score

df_copy['eng'] = df['eng'].apply(plusn, n=1) # df['eng']의 모든 점수에 1점 더하기 in [0,100]

지금까지 예제는 함수를 특정 한 컬럼을 지정하여 일괄 적용했다.

전체를 일괄 적용하려면 axis 옵션을 추가한다.

 

 

df.apply(함수이름, 변수지정(생략可), axis = 0 or 1)

 

axis = 0   -> col에 대한 연산을 각각 전체 col에 적용

axis = 1   -> row에 대한 연산을 각각 전체 row에 적용

 

Ex) col에 대한 연산을 제일 아래에 출력한다.

def get_sum(x):    # 합계 구하는 함수
    return x.sum()
    
df_copy.loc['sum'] = df.apply(get_sum, axis=0)   # 과목 별 점수 합계
df_copy

 

Ex) row에 대한 연산을 제일 오른쪽에 출력한다.

df_copy['sum'] = df.apply(get_sum, axis=1)  # 학생 별 점수 합계
df_copy

 

 

 

 

(잠깐 예제) index를 지우고 기존 컬럼으로 대체하기

df = pd.read_csv('data/scores.csv')
df = df.head()
df.index = df.name         # <-- 이 부분이 index를 name으로 대체하는 부분
df.drop(columns=['name'], inplace=True)  # <- 기존 name 칼럼은 지움
df_copy = df.copy()
df.head()
df_copy.head()

df, df_copy와 결과 출력물 동일함

 

 

 

 

[잠깐 note]

apply() ->  df, series 둘 다 적용 可   df에 lamda함수 쓸 수 있게 해줌

map()   ->  series만 적용 可  합성함수 mapping 개념. index기준으로 transition.

applymap()  ->  df만 적용 可

 

 

 

 

[map 함수 예제]

 

주어진 데이터에 대해서 Indicator을 삭제하고 First Tooltip 컬럼에서 신뢰구간에 해당하는 표현을 지워라

df.drop('Indicator',axis=1,inplace=True)         # col indicator 삭제

df['First Tooltip'] = df['First Tooltip'].map(lambda x: float(x.split("[")[0]))
# lambda쓰기위해 map씀. 해당 부분은 string이므로 float형태로 '['기준으로 나눈 후 [0]째 부분만 추출

Ans = df
Ans.head(4)

 

 

728x90
반응형