상세 컨텐츠

본문 제목

[Pandas] DataFrame에 열 추가 하기

머신러닝 딥러닝/PANDAS

by 힐둔 2021. 8. 3. 18:37

본문

 

문제 >

10명의 학생의 국어, 영어, 수학 점수만 있는 상태에서 각 학생별 국어, 영어, 수학의 평균 내고 이것을 DataFrame에 추가하기. - 10명의 점수는 아래와 같이 Dictionary로 주워집니다.

 

data = { '국어' : [90, 70, 80, 80, 100, 90, 100, 90, 90, 80], 
'영어' : [60, 70, 50, 40, 60, 70, 90, 100, 70, 80], 
'수학' : [90, 90, 70, 80, 100, 100, 70, 60, 90, 90]

 

우선 pandas를 import 한 후

import pandas as pd

 

index는 편의상 알파벳으로 하고, columns은 '국어','영어','수학'을 표시하는 DataFrame을 생성합니다.

원하는대로 잘 생성된 걸 확인할 수 있습니다.

frame = pd.DataFrame(data,columns=['국어','영어','수학'],index=list('abcdefghij'))


data frame의 mean 함수 이용

첫번째 방법으로 아래와 같이 mean을 이용해 국,영,수의 평균을 구하고, '평균'이라는 열을 추가할 수 있습니다. 이전에 가지고 있지 않은 column의 label을 적는 것은 새로운 column을 만드는 효과를 가져옵니다. 가로를 더해서 평균을 내야 하니까 axis 정보는 1이 됩니다.

frame['평균'] = frame.mean(axis=1)

 

찍어보면 아래와 같이 원하는 대로 출력됩니다. 가장 간단하면서 효과적인 방법입니다.

 


DataFrame의 assign을 이용

이번에는 assign함수에 lambda 함수를 포함한 인자로 전달하여 생성을 해봅시다.

frame.assign(평균=lambda x: (x['국어']+x['영어']+x['수학'])/3)


 

아래는 내가 아무것도 모를때 시도했던 방법이다.

초기값 0을 갖는 Series를 생성해서 평균이라는 column을 추가한 후, 각각의 행의 평균을 업데이트 하는 방식이다. 한줄로 될 것을 참 어렵게도 구했다.

 

일단, 아래와 같이 초기값 0을 갖는 Series 객체를 생성한다. DataFrame생성시 index를 알파벳으로 설정했더니, 아래와 같이 마지막에 list를 지정해줘야 한다. 추가를 하지 않으면 index가 matching 되지 않기에 NaN이 표시된다. 애초에 기본 생성되는 index를 수정하지 않았더라면 이런 문제도 없었......

 

frame['평균'] = pd.Series([0,0,0,0,0,0,0,0,0,0],index=list('abcdefghilj'))

index를 수정한 여파가 여기에도 있다. loc 말고 iloc를 이용해서 사용해야만 한다. iloc를 사용하게 되면 list처럼 slicing 등을 표현할수 있다고 한다. 아래는 '0행, 국어:영어:수학'이라는 Series 객체를 얻어오는 방법이고,

sdata=frame.iloc[0,0:3]

찍어보면, 아래처럼 'a'행의 국어, 영어, 수학 점수가 표시된다, 이는 Series 객체이므로 Series의 평균 구하는 함수를 이용할 수 있다.

 

아래의 표현으로 'a'행의 평균을 구할 수 있다.

frame.iloc[0,0:3]).mean()

(

이를 아래와 같이 for loop로 모든 행에 적용을 해보면 동일한 효과를 거둘수 있지만 비효율적이다.

평균 값도 소수점 이하 자리가 없다.

for fr in range(10): frame.iloc[fr,3] = (frame.iloc[fr,0:3]).mean()

 

 

관련글 더보기

댓글 영역