Pandas: 한 셀의 데이터를 여러 행으로 나누기

1
2
df = pd.DataFrame({'alphabet': ['hello,world,in,python', 'python,is,great', 'data,science']})
df

alphabet
0 hello,world,in,python
1 python,is,great
2 data,science
위와 같이 한 셀에 들어있는 문자열을 컴마로 구분해서 한 글자씩 여러 행으로 나누고 싶다.

해결책:

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

먼저, 각 alphabet 컬럼의 문자열을 배열로 나눈다.
1
2
result = df['alphabet'].str.split(',')
result
0    [hello, world, in, python]
1           [python, is, great]
2               [data, science]
Name: alphabet, dtype: object



배열이 Series를 리턴하게 apply를 적용하면 Series -> DataFrame으로 변환할 수 있다.
1
2
result = result.apply(lambda x: pd.Series(x))
result

0 1 2 3
0 hello world in python
1 python is great NaN
2 data science NaN NaN
stack()을 활용하여 컬럼을 행으로 변환한다.
1
result.stack()
0  0      hello
   1      world
   2         in
   3     python
1  0     python
   1         is
   2      great
2  0       data
   1    science
dtype: object



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

알파벳 낱자만 가져오기 위해 인덱스를 초기화하고, 기준이 된 인덱스도 제거해보자.
1
result.stack().reset_index(level=1, drop=True)
0      hello
0      world
0         in
0     python
1     python
1         is
1      great
2       data
2    science
dtype: object



데이터프레임으로 변환하자
1
2
result = result.stack().reset_index(level=1, drop=True).to_frame('alphabet_single')
result

alphabet_single
0 hello
0 world
0 in
0 python
1 python
1 is
1 great
2 data
2 science
원본 프레임과 위의 프레임을 merge 해보자
1
2
result = df.merge(result, left_index=True, right_index=True, how='left')
result

alphabet alphabet_single
0 hello,world,in,python hello
0 hello,world,in,python world
0 hello,world,in,python in
0 hello,world,in,python python
1 python,is,great python
1 python,is,great is
1 python,is,great great
2 data,science data
2 data,science science
You need to set install_url to use ShareThis. Please set it in _config.yml.
You forgot to set the business or currency_code for Paypal. Please set it in _config.yml.

Comments

You forgot to set the shortname for Disqus. Please set it in _config.yml.