Py) 전처리 - 데이터프레임 값 매칭 및 요약

Py) 전처리 - 데이터프레임 값 매칭 및 요약

데이터프레임의 원소값과 변수명을 매칭하여 요약하는 전처리 예제를 알아본다.

문제 상황

다음과 같은 데이터를 정제하여

1
2
3
4
import pandas as pd
df = pd.DataFrame([[1, 1, 1], [0, 0, 1], [1, 1, 0], [0, 0, 0]],
columns = ["A", "B", "C"])
df
A B C
0 1 1 1
1 0 0 1
2 1 1 0
3 0 0 0

아래와 같은 결과를 얻어야 한다.

1
2
df_result = pd.DataFrame([["A,B,C"], ["C"], ["A,B"], [""]], columns = ["summary"])
df_result
summary
0 A,B,C
1 C
2 A,B
3

과정

반복문을 활용한 접근은 다음과 같다.

1
2
3
4
df2 = df.copy()
for col in df.columns:
df2[col] = df2[col].replace(to_replace = 1, value = col)
df2[col] = df2[col].replace(to_replace = 0, value = "")

물론 NumPynp.where()함수를 사용하면 더 간결해진다.

일단 결과는 다음과 같다.

1
df2
A B C
0 A B C
1 C
2 A B
3

각 원소를 이어붙이기 위해서는 + 연산자로 텍스트를 이어붙일 수 있다. 하지만 변소(or 원소) 개수가 많은 경우는 .join() 을 시도해보는 것이 좋다.

1
2
3
4
5
6
7
8
"a" + "," + "b"
## a,b

",".join(["a", "b"])
## a,b

",".join(df2.iloc[0])
## 'A,B,C'

.join() 을 데이터프레임이 lambda 함수를 활용하여 적용해보자.

1
2
3
4
5
6
df2.apply(lambda x: ",".join(x), axis = 1)
## 0 A,B,C
## 1 ,,C
## 2 A,B,
## 3 ,,
## dtype: object

일단 결과가 비슷하게 나오긴 했는데 최종 결과와 일치시키려면 불필요한 구분자는 제거해야 한다. 조금 더 간결하고 효과적인 방법을 알아보자. 일단 데이터프레임의 변수는 .column 으로 뽑아낼 수 있다는 것은 알고 있을 것이다. 그리고 TrueFalse 를 사용하면 원하는 변수명만 뽑아낼 수 있다.

1
2
3
4
5
6
7
8
df.columns # 1
## Index(['A', 'B', 'C'], dtype='object')

df.columns[[True, False, True]] # 2
## Index(['A', 'C'], dtype='object')

df.columns[pd.Series([1, 0, 1]).astype("bool")] # 3
## Index(['A', 'C'], dtype='object')

여기서 “df” 데이터프레임 객체 내부의 값은 1과 0으로만 이루어져 있기 때문에 해당 값을 전부 논리값으로 변환하여 .apply() 메서드를 사용하면 보다 간결하게 처리할 수 있다는 힌트를 얻을 수 있다.

결과

1
2
3
4
5
6
df.apply(lambda x: ",".join(df.columns[x.astype("bool")]), axis = 1)
## 0 A,B,C
## 1 C
## 2 A,B
## 3
## dtype: object
Your browser is out-of-date!

Update your browser to view this website correctly. Update my browser now

×