본문 바로가기

Computer Science/파이썬

[Python] Feature Engineering 1 - DataFrame manipulation (단순 합계 column생성, string to numeric with replace def, Concat, Merge, Join)

1. 기존 데이터프레임에서 선택한 컬럼의 값들의 합의 값으로 새로운 컬럼을 추가

이때 column의 값은 numerical data(int, float)

df['새로만들컬럼이름'] = df['기존col1'] + df['기존col2'] + df['기존col3']
df

2. 숫자의 콤마( ' , ')를 교체하는 방법

숫자에 ' , ' 가 기재되어 있을시 numeric data가 아닌 string으로 인식 하므로 숫자의 ', '를 공백으로 대치하여야 한다.

[in]
testString = '25,970'
testString = testString.replace(',','')
[out]
'25970'

데이터셋에 적용하기 위해서는 apply 함수를 사용하여 각 column에 한번에 적용 해주어야 한다.

# def로 함수 선언
def toInt(string):
    return int(string.replace(',',''))

# 하나의 string 일경우
toint('25,970')
[out 1]
25970

#DataFrame의 column에 적용할 경우 apply 모듈을 적용한다.
df['column_name'] = df['column_name'].apply(toInt)

3. Concatenate (Concat)

데이터 프레임을 더할때 일반적으로 더해지는 row, column의 이름이나 인덱스 값이 일치해야 한다. 그렇지 않은경우, 비어있는 부분에 대해서는 NaN값으로 채워짐.

- "+" 연산자를 사용하여 문자열을 더한다

- pd.concat([df1, df2]) >>> row 방향으로 데이터 프레임을 더한다. 이때, 옵션으로 ignore_index=True를 주면 인덱스를 재배열 할 수 있다.

- pd.concat([df1, df2], axis=1) >>> column방향으로 데이터 프레임을 더한다. 옵셩으로 join하는 방식을 고를 수 있다. default값은 outer 이며 합집합을 의미. join='inner'일 경우 교집합을 의미. 두데이터에 모두 존재하는 row인덱스만 가지고 온다.(NaN값이 있는 row는 가져오지 않음)

데이터프레임 + 시리즈 객체

- 시리즈 객체를 생성할때 주는 옵션으로 name을 주고 이 시리즈가 데이터 프레임에 결합되었을때 column의 이름이 됨.index옵션을 주면 그에 맞게 concat됨

sr1 = pd.Series(['e0','e1','e2','e3'], name = 'e')
sr2 = pd.Series(['f0','f1','f2'], name = 'f', index = [3,4,5])
sr3 = pd.Series(['g0','g1','g2','g3'], name = 'g')

new_df_1 = pd.concat([df1,sr1], axis=1)

[Output]
    a   b   c   e
0  a0  b0  c0  e0
1  a1  b1  c1  e1
2  a2  b2  c2  e2
3  a3  b3  c3  e3 

new_df_2 = pd.concat([df2,sr2], axis=1)

[Output2]
    a   b   c   d    f
2  a2  b2  c2  d2  NaN
3  a3  b3  c3  d3   f0
4  a4  b4  c4  d4   f1
5  a5  b5  c5  d5   f2 

# 시리즈 객체 끼리 붙였을때 axis=1로 적용하면 데이터 프레임이 되고, axis=0으로 적용하면 그대로 시리즈
new_df_3 = pd.concat([sr1, sr3], axis = 1)
[out]
    e   g
0  e0  g0
1  e1  g1
2  e2  g2
3  e3  g3
<class 'pandas.core.frame.DataFrame'>

new_series = pd.concat([sr1, sr3], axis = 0)
[out]
0    e0
1    e1
2    e2
3    e3
0    g0
1    g1
2    g2
3    g3
dtype: object

 

4.Merge

concat과 달리 공통된 부분을 기반으로 합치는 용도이며 다양한 옵션으로 합칠 수 있다.

- df.merge("붙일 내용df", how = "(방법)", on ="(기준 feature)")

df = df.merge(df2, how = 'inner', on = '종목')
df

- how 옵션은 어떻게 합칠지 지정해주는 부분.(‘left’, ‘right’, ‘outer’, ‘inner’, ‘cross’}

how = 'inner', on = '기준 feature' >> 데이터셋의 교집합의 데이터만 나타낸다. << deafault값

       - on 옵션은 기준 column을 정해주는 것으로 None이 default값 이며 padas가 임의의 공통 col을 기준으로 한다.

how = 'outer', on='기준 feature' >> 모두 합친다. 기준이 되는 컬럼으로 합치고 데이터가 없는경우 NaN값이 된다.

how = 'left', left_on = '왼쪽 기준feature', right_on ='왼쪽기준에대응하는 기준feature'

how = 'cross' 카티전 곱을 해서 ...

https://pandas.pydata.org/pandas-docs/stable/reference/api/pandas.DataFrame.merge.html

 

pandas.DataFrame.merge — pandas 1.2.4 documentation

If True, adds a column to the output DataFrame called “_merge” with information on the source of each row. The column can be given a different name by providing a string argument. The column will have a Categorical type with the value of “left_only

pandas.pydata.org

5. Join

join과 merge는 함수기반이기때문에 기본 작동방식은 비슷하나. join()은 row인덳를 기준으로 결합.

- df1.jpin(df2) >> df1의 index를 기준으로 합친다.