이번 포스팅에서는

 

(1) pandas.Series.explode() 메소드를 사용해서  Series 안의 리스트를 행으로 변환하기 

(2) pandas.Series.explode() 메소드를 사용해서 DataFrame 안의 리스트를 행으로 변환하기

(3) DataFrame의 float 자리수를 지정해주기

 

방법을 소개하겠습니다. 

 

 

 

 

 

(1) pandas.Series.explode() 메소드를 사용해서  Series 안의 리스트(list)를 행으로 변환하기

 

ignore_index=False 가 디폴트 모드이며, 같은 리스트 내 원소들에 대해서는 같은 인덱스 번호가 부여됩니다. 

 

import pandas as pd

# Series.explode(ignore_index=False)
# Transform each element of a list-like to a row.

s = pd.Series([[4, 9, 6, 1, 8], 'love', [], [3, 0, 1]])

## # by default: ignore_index=False
s.explode(ignore_index=False)

# 0       4
# 0       9
# 0       6
# 0       1
# 0       8
# 1    love
# 2     NaN
# 3       3
# 3       0
# 3       1
# dtype: object

 

 

ignore_index=True 로 설정을 해주면 0, 1, ..., n-1 의 순서대로 인덱스 번호가 부여됩니다. 

 

## If 'ignore_index=True', the resulting index will be labeled 0, 1, …, n - 1.
s.explode(ignore_index=True)

# 0       4
# 1       9
# 2       6
# 3       1
# 4       8
# 5    love
# 6     NaN
# 7       3
# 8       0
# 9       1
# dtype: object

 

 

 

(2) pandas.Series.explode() 메소드를 사용해서 DataFrame 안의 리스트를 행으로 변환하기

 

먼저, 리스트를 원소로 가지는 pandas DataFrame을 예시로 만들어보겠습니다. 바로 이어서 리스트를 풀어서 각 행으로 변환할 것이므로 각 열별 리스트 내 원소의 개수가 서로 같아야 합니다. 

 

## DataFrame with lists
df = pd.DataFrame({
    'grp': [['a', 'a', 'a', 'b', 'b', 'b', 'c', 'c', 'c']], 
    'id': [[1, 2, 3, 4, 5, 6, 7, 8, 9]], 
    'value': [[0.0, 0.421948, 0.9422, 0.582, 0.0, 0.28574, 0.55382, 0.2801, 0.87]]
})

print(df)
#                       grp \
# [a, a, a, b, b, b, c, c, c]  
#
#                       id  \
# [1, 2, 3, 4, 5, 6, 7, 8, 9]   
#                                                               value  
# [0.0, 0.421948, 0.9422, 0.582, 0.0, 0.28574, 0.55382, 0.2801, 0.87]]

 

 

위의 (1)번에서 소개했던 pandas.Series.explode() 메소드를 apply() 함수를 사용해서 위에서 만든 DataFrame df 의 모든 열에 적용해줍니다. 옆으로 길게 리스트 형태로 있던 DataFrame 내 원소가 각 행(row)의 개별 원소로 풀어져서 세로로 긴 DataFrame 형태로 변형되었습니다. 

 

## unpacking the lists in DataFrame
df_unpacked = df.apply(pd.Series.explode)

print(df_unpacked)
#   grp id     value
# 0   a  1       0.0
# 0   a  2  0.421948
# 0   a  3    0.9422
# 0   b  4     0.582
# 0   b  5       0.0
# 0   b  6   0.28574
# 0   c  7   0.55382
# 0   c  8    0.2801
# 0   c  9      0.87

 

 

 

(3) DataFrame의 float 자리수를 지정해주기

 

세번째 칼럼인 'value'의 float 값들의 자리수가 서로 달라서 보기에 좋지 않습니다. 이럴 경우 astype(float).round(2) 메소드를 사용해서 소수점 2째 자리로 반올일해서 자리수를 일치시켜주면 보기에 깔끔하고 좋습니다. 

 

## Output to two decimal places
df_unpacked['value'] = df_unpacked['value'].astype(float).round(2)

print(df_unpacked)
#   grp id  value
# 0   a  1   0.00
# 0   a  2   0.42
# 0   a  3   0.94
# 0   b  4   0.58
# 0   b  5   0.00
# 0   b  6   0.29
# 0   c  7   0.55
# 0   c  8   0.28
# 0   c  9   0.87

 

 

[ Reference ]

* pandas.Series.explode() 메소드

   : https://pandas.pydata.org/docs/reference/api/pandas.Series.explode.html

 

 

이번 포스팅이 많은 도움이 되었기를 바랍니다. 

행복한 데이터 과학자 되세요!  :-)

 

728x90
반응형
Posted by Rfriend
,