티스토리 뷰

발생일: 2018.09.22

키워드: pandas, stack, unstack, split array to multiple rows

문제:

df = pd.DataFrame({'foo': ['a,b,c,d,e', 'd,e,f', 'h,i']})
df


위와 같이 한 셀에 들어있는 문자열을 컴마로 구분해서 한 글자씩 여러 행으로 나누고 싶다.


해결책:

문자열을 split 해 각 행을 여러 컬럼으로 나눈 후 병합하는 방법으로 구현할 수 있다.

먼저, 각 foo 컬럼의 문자열을 배열로 나눈다.

split = df.foo.str.split(',')
split



각 배열이 Series를 리턴하게 apply를 적용하면, Series -> DataFrame으로 변환할 수 있다.

split = split.apply(lambda x: pd.Series(x))
split



stack() 으로 컬럼을 행으로 변환할 수 있다.

split.stack()


stack()을 실행하면, 위와 같이 멀티 인덱스를 가진 Series가 된다.

알파벳 낱자만 가져오기 위해 인덱스를 초기화하고, 기준이 된 인덱스도 제거해보자.


split.stack().reset_index(level=1, drop=True)



이 결과는 Series이기 때문에, DataFrame으로 변환해보자.
to_frame()이 파라미터로 컬럼명을 지정할 수 있다.

split = split.stack().reset_index(level=1, drop=True).to_frame('foo_single')
split



필요에 따라, 원본 프레임에 left join으로 머지하면 아래와 같이 의도했던 결과를 얻을 수 있다.

df.merge(split, left_index=True, right_index=True, how='left')


반응형
댓글
공지사항