본문 바로가기
Python

[python] 데이터프레임 내의 값이 2차원리스트 일 때 2차원 리스트끼리 합치기

by clolee 2021. 10. 12.

데이터프레임 내에서 특정 열의 값이 2차원 리스트로 되어있을 때 특정 조건에 대해서 행끼리 더할 경우

2차원 리스트로 저장된 해당 열은 2차원리스트 형태를 그대로 유지하며 그 안의 1차원 리스트들을 합치고자 한다.

 

우선 예시로 세 개의 리스트를 만든다.

my_list = [['hello', 4, 2], ['안녕', 5, 4]]
my_list2 = [['판다스', 52, 25], ['데이터프레임', 0, 3]]
my_list3 = [['파이썬', 40, 20], ['안녕안녕', 10, 5], ['댓글문자열', 2, 3]]

 

각 행이 Date 와 이중리스트를 열의 값으로 갖는 데이터프레임으로 만들어 출력해보면 다음과 같다.

df_list = pd.DataFrame({'Date' : '2021-10-12', 'Comment' : [my_list]})
df_list = df_list.append({'Date' : '2021-10-12', 'Comment' : my_list2}, ignore_index=True)
df_list = df_list.append({'Date' : '2021-10-12', 'Comment' : my_list3}, ignore_index=True)
df_list

 

이제 세 행의 2차원 리스트를 갖는 열을 같은 Date에 대하여 더해

세 리스트를 더해서 print했을 때와 같은 결과를 데이터프레임 안에서 보고자 한다.

import itertools
def sum_comment(x):
  d = []
  d.extend(x)
  dd = list(itertools.chain.from_iterable(d))
  return dd

 

df_list_merge = df_list.groupby(['Date'], as_index=False).agg({'Comment' : lambda x : sum_comment(x)})
df_list_merge

python lambda 참고 :

2021.10.25 - [python] - [python] 파이썬 람다 함수 사용하기 (python lambda expression)

 

같은 Date를 갖는 행의 Comment열을 더할 것이므로 df_list에 groupby(['Date'])를 적용하고

agg에서 sum_comment 함수를 실행한다.

 

sum_comment 함수 안에서 groupby(['Date']) 조건을 만족하는 2차원 리스트들을 새로 만든 리스트 d에 추가한 후

itertools 모듈의 itertools.chain.from_iterable() 메서드를 사용해 flatten 하면

3차원리스트 -> 2차원리스트로 되어 

 

[[['hello', 4, 2], ['안녕', 5, 4]][['판다스', 52, 25], ['데이터프레임', 0, 3]][['파이썬', 40, 20], ['안녕안녕', 10, 5], ['댓글문자열', 2, 3]] 

 

형태에서 

 

[['hello', 4, 2], ['안녕', 5, 4], ['판다스', 52, 25], ['데이터프레임', 0, 3], ['파이썬', 40, 20], ['안녕안녕', 10, 5], ['댓글문자열', 2, 3]]

 

와 같은 기존의 2차원 리스트와 같은 형태로 변환되어 return한다.

데이터프레임을 확인해보면 같은 'Date'에 대해 Comment 들이 모두 합쳐져 2차원리스트에 담긴 것을 확인할 수 있다.

 

 

 

참고 : 

https://blog.winterjung.dev/2017/04/21/list-of-lists-to-flatten

https://stackoverflow.com/questions/29583312/pandas-sum-of-duplicate-attributes

 

 

댓글