파이썬/라이브러리(API)

판다스 데이터프레임에서 조건문(if문)으로 데이터 넣기

코데방 2024. 3. 7.
728x90

판다스에서 열(시리즈) 추가하기

 

가장 기본적으로 아래와 같이 추가해줄 수 있습니다. 의미 있는 데이터를 바로 넣어줘도 되고 껍데기만 넣어줘도 됩니다. 중복된 컬럼명을 넣으면 에러가 발생합니다. 

 

dataframe['컬럼명'] = 0

 

 

 

 

위와 같은 방법으로 생성하면 열이 가장 오른쪽에 생성됩니다. 만약 원하는 위치에 삽입하고자 한다면 "insert()" 메소드를 써주면 됩니다.

 

매개변수는 (삽일할 인덱스 번호, 컬럼명, 데이터) 순입니다. 아래 코드는 3번 인덱스 순서에 새로운 컬럼을 일단 0을 넣어서 생성하겠다는 의미입니다. 

dataframe.insert(3, "컬럼명", 0)

 

 

 

 

 

판다스 데이터프레임 열에 조건문으로 데이터 삽입하기

 

데이터를 다루다보면 다른 컬럼들을 참고해서 새로운 컬럼의 값을 동적으로 지정해야할 경우가 있습니다. 여러 가지 방법이 있는데 몇 가지 방법을 살펴보겠습니다.

 

먼저 아래와 같은 데이터가 있습니다.

하려고 하는 작업은 "성별2"의 컬럼을 만들어 "age < 20"일 경우 "어린이"를, 그 외에는 "sex"의 내용대로 male일 경우 "남자", female일 경우 "여자"의 값이 들어가도록 하는 것입니다. 

 

 

 

 

1. loc 함수를 통해 조건 걸기

 

단순한 조건이라면 효율적인 방법입니다.

loc() 함수는 "행이름" 기준으로 데이터를 찾아주는 함수입니다. 먼저 행을 찾은 뒤 원하는 열을 지정할 수 있기 때문에 특정 행과 열에 동시에 접근해 작업할 때는 보통 loc() 함수를 많이 사용합니다.

 

"dataframe.loc(행이름(또는 행의 조건), 열이름) = 넣을 데이터" 형태로 작성하시면 됩니다. 여러 개의 열에 동시 접근하려면 열이름 부분을 리스트로 묶어주면 됩니다.

 

이렇게 하면 쉽게 접근할 수 있지만 하드코딩 형태라 크게 좋아 보이진 않습니다. 

 

 

titanic.loc[titanic["age"] < 20, "성별2"] = "어린이"
titanic.loc[titanic["age"] >= 20,"성별2"] = titanic["sex"]

 

 

 

게다가 성별("sex")에 따라 한글로 "남자", "여자"로 바꿔주는 작업이 제대로 되지 않습니다. 

파이썬 기본 문법처럼 아래와 같이 조건문을 써주면 될 것 같지만 데이터프레임에서는 "ValueError"가 발생합니다. 

titanic.loc[titanic["age"] >= 20,"성별2"] = "남자" if titanic["sex"] == "male" else "여자"

 

 

"ValueError: The truth value of a Series is ambiguous. Use a.empty, a.bool(), a.item(), a.any() or a.all()"

에러가 나는 이유는 titanic["sex"]라는 것은 하나의 열 전체를 의미하기 때문입니다.

각 행에 위치하는 titanic["sex"]의 값이 아닌 열 전체이기 때문에 모든 값을 한번에 "male"이라는 단어와 비교하라는 의미가 되어버려서 에러가 나는 것입니다. 

 

 

 

 

2. 인덱스와 반복문을 이용해 조건문 사용해 컬럼에 데이터 넣기

 

위에서 말했듯이 데이터프레임에 유동적으로 데이터를 넣기 위해서는 하나의 행별로 작업이 되어야 합니다. 

 

"datafram.index.stop" 을 사용하면 전체 행의 갯수를 알 수 있으므로, 이를 이용해 한 행씩 돌며 원하는 작업을 할 수 있습니다.

 

위에서 다룬 loc() 함수를 사용해 한 줄의 행을 하나씩 작업하도록 하는 반복문입니다. 이 경우 한 작업에서 전체 컬럼(시리즈)가 아닌 한 행만을 다루므로 if문을 쉽게 사용할 수 있게 됩니다.

for i in range(0, titanic.index.stop):
    if titanic.loc[i, "age"] < 20:
        titanic.loc[i, "성별2"] = "어린이"
    else:
        titanic.loc[i, "성별2"] = "남자" if titanic.loc[i, "sex"] == "male" else "여자"

 

 

 

 

3. 데이터프레임의 apply() 메소드를 이용해 조건문 사용하기

 

이 방법이 가장 스마트한 방법인 듯합니다. 

 

판다스에서 제공하는 apply() 메소드는 어떠한 열에 데이터를 넣을 때 한 행씩 적용되는 함수를 만들어 적용해줄 수 있도록 해줍니다. 

 

내부적으로는 위의 반복문처럼 돌지 않을까 하는데 똑똑한 사람들이 만들어둔만큼 좀 더 효율적으로 돌아가지 않을까 싶습니다.

 

먼저 필요한 함수를 하나 만들어줍니다. 매개변수는 데이터프레임 객체 자체입니다. 

def app(x):
    if x["age"] > 20:
        if x["sex"] == "male":
            a = "남자"
        else:
            a = "여자"
    else:
        a = "어린이"
    return a

 

 

 

 

 

이를 apply() 함수를 적용해주면 됩니다. "axis = 1" 옵션은 "행단위"로 작업한다는 의미입니다. 행단위로 작업해줄 때는 꼭 같이 넣어줘야 하는 옵션입니다.

 

이 코드의 의미는 "성별2" 컬럼에 행별로 데이터를 넣되, 행별로 넣을 데이터를 지정한 함수의 로직에 따르겠다라는 의미입니다. "행단위 작업" 이라는 전제가 들어있기 때문에 apply() 함수 없이 그냥 조건문을 사용할 때 나는 에러가 나지 않습니다. 

titanic["성별2"] = titanic.apply(app, axis =1)

 

 

 

 

위 코드를 좀 더 간단하게 표현하려면 아래와 같이 람다를 사용할 수 있습니다. 

titanic['성별2'] = titanic.apply(lambda x : "남자" if x["sex"] == "male" 
                               else "여자" if x["age"] > 20 else '어린이', axis=1)

 

 

 

 

 

 

 

 

 

 

 

728x90

댓글

💲 추천 글