본문 바로가기
파이썬/파이썬 pandas

[pandas] 데이터에 함수 적용하기 apply

by Merware 2023. 5. 11.

데이터 준비하기 

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

df.head()
"""

	name	kor	eng	math
0	Aiden	100.0	90.0	95.0
1	Charles	90.0	80.0	75.0
2	Danial	95.0	100.0	100.0
3	Evan	100.0	100.0	100.0
4	Henry	NaN	35.0	60.0
"""

df_copy.head()
"""
	name	kor	eng	math
0	Aiden	100.0	90.0	95.0
1	Charles	90.0	80.0	75.0
2	Danial	95.0	100.0	100.0
3	Evan	100.0	100.0	100.0
4	Henry	NaN	35.0	60.0
"""

 

함수로 컬럼의 데이터 변경하기

  • 컬럼.apply(함수명)
  • 컬럼.apply(함수명, 매개변수명=매개변수값)
    매개변수명을 명시해주어야 한다.
  • 적용할 함수가 미리 정의되어 있어야 한다.
#df['math']의 모든점수에 5점 더하기.(--> 105점?)
df_copy.math = df.math+5
df_copy

"""
name	kor	eng	math
0	Aiden	100.0	90.0	100.0
1	Charles	90.0	80.0	80.0
2	Danial	95.0	100.0	105.0
3	Evan	100.0	100.0	105.0
4	Henry	NaN	35.0	65.0
"""

 

#df['math']의 모든점수에 5점 더하기. 100점이 넘을 수 없다.
def plus5(x):
    score = x+5
    if score>=100:
        score=100
    return score

df_copy['math'] = df['math'].apply(plus5)
df_copy
"""
	name	kor	eng	math
0	Aiden	100.0	90.0	100.0
1	Charles	90.0	80.0	80.0
2	Danial	95.0	100.0	100.0
3	Evan	100.0	100.0	100.0
4	Henry	NaN	35.0	65.0
"""
# 모든 점수에 n점 더하기. 100점이 넘을 수 없다.
def plusn(x,n):
    score = x+n
    if score>=100:
        score=100
    return score

# df['eng']의 모든 점수에 1점 더하기. 100점이 넘을 수 없다.
df_copy['eng'] = df['eng'].apply(plusn, n=1)

df_copy
"""
	name	kor	eng	math
0	Aiden	100.0	91.0	100.0
1	Charles	90.0	81.0	80.0
2	Danial	95.0	100.0	100.0
3	Evan	100.0	100.0	100.0
4	Henry	NaN	36.0	65.0
"""

 

함수로 행/열의 데이터 집계하기

  • 데이터프레임.apply(함수명, axis=0) : 열단위로 함수가 적용된다.
  • 데이터프레임.apply(함수명, axis=1) : 행단위로 함수가 적용된다.
df = pd.read_csv('data/scores.csv')
df = df.head()
df.index = df.name
df.drop(columns=['name'], inplace=True)
df_copy = df.copy()

df.head()
"""
	kor	eng	math
name			
Aiden	100.0	90.0	95.0
Charles	90.0	80.0	75.0
Danial	95.0	100.0	100.0
Evan	100.0	100.0	100.0
Henry	NaN	35.0	60.0
"""

df_copy.head()
"""
	kor	eng	math
name			
Aiden	100.0	90.0	95.0
Charles	90.0	80.0	75.0
Danial	95.0	100.0	100.0
Evan	100.0	100.0	100.0
Henry	NaN	35.0	60.0

 

# 행단위 데이터 출력
def print_me(x):
    print(x)

df.apply(print_me, axis=1)

"""
kor     100.0
eng      90.0
math     95.0
Name: Aiden, dtype: float64
kor     90.0
eng     80.0
math    75.0
Name: Charles, dtype: float64
kor      95.0
eng     100.0
math    100.0
Name: Danial, dtype: float64
kor     100.0
eng     100.0
math    100.0
Name: Evan, dtype: float64
kor      NaN
eng     35.0
math    60.0
Name: Henry, dtype: float64
name
Aiden      None
Charles    None
Danial     None
Evan       None
Henry      None
dtype: object

 

# 합계 구하기
def get_sum(x):
    return x.sum()
    
# 학생 별 점수 합계
df_copy['sum'] = df.apply(get_sum, axis=1)

df_copy
"""
	kor	eng	math	sum
name				
Aiden	100.0	90.0	95.0	285.0
Charles	90.0	80.0	75.0	245.0
Danial	95.0	100.0	100.0	295.0
Evan	100.0	100.0	100.0	300.0
Henry	NaN	35.0	60.0	95.0

 

# 과목 별 점수 합계
df_copy.loc['sum'] = df.apply(get_sum, axis=0)

df_copy
"""
	kor	eng	math	sum
name				
Aiden	100.0	90.0	95.0	285.0
Charles	90.0	80.0	75.0	245.0
Danial	95.0	100.0	100.0	295.0
Evan	100.0	100.0	100.0	300.0
Henry	NaN	35.0	60.0	95.0
sum	385.0	405.0	430.0	NaN