티스토리 뷰
발생일: 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')
반응형
댓글
공지사항