본문 바로가기

Lang

Pandas DataFrame 의 특정 컬럼 값 변환하는 방법

map 함수 이용하여 DataFrame 특정 컬럼 값 변환하는 방법.

from pandas import DataFrame

data = {
    'maker': ['apple.com', 'google.com', 'apple.com', 'oralce.com', 'ibm.com'],
    't_val': [200, 150, 130, 300, 230]
}

df = DataFrame(data)
df['t_val2'] = df['t_val'].map(lambda x: x * 2)
print(df)

특정 컬럼의 값을 조건에 의해 변환하는 몇 가지 방법.

1. numpy 의 select 함수를 이용.

import numpy as np
from pandas import DataFrame

data = {
    'maker': ['apple.com', 'google.com', 'apple.com', 'oralce.com', 'ibm.com']
}

conditions = [df.maker == "apple.com", df.maker == "google.com", df.maker != '']
choices = [1, 2, 3]
df['maker_cd'] = np.select(conditions, choices)
print(df)

2. 비슷하지만 안되는 경우.

data = {
    'maker': ['apple.com', 'google.com', 'apple.com', 'oralce.com', 'ibm.com']
}

conditions = [df.maker.startswith("apple"), df.maker.startswith("google"), df.maker != '']
choices = [1, 2, 3]
df['maker_cd'] = np.select(conditions, choices)
print(df)

1번은 잘 동작하지만 2번은 다음과 같은 에러가 난다.

AttributeError: 'Series' object has no attribute 'startswith'

2번 해결하기 위해 이것저것 해보다 역시나 구글링 이용해서 찾은 방식.

3. numpy 의 vectorize 이용한 방법

import numpy as np
from pandas import DataFrame

def maker_conditions(x):
    if x.startswith("apple"):
        return 10
    elif x.startswith("google"):
        return 20
    elif x.startswith("ibm"):
        return 30
    else:
        return 0

data = {
    'maker': ['apple.com', 'google.com', 'apple.com', 'oralce.com', 'ibm.com']
}

df = DataFrame(data)

func = np.vectorize(maker_conditions)
df['maker_cd'] = func(df.maker)
print(df)

뭔가 더 쌈박한 방법이 있을 듯 한데 ...