프로그래밍/Python

Python 특정 키 값을 기준으로 Dictionary List에서 더하기

Lou Park 2022. 5. 7. 10:47

문제

arr = []
arr.append({"name": "A", "acquired_xp": 200, "key": 1, "data": 1})
arr.append({"name": "B", "acquired_xp": 500, "key": 2})
arr.append({"name": "B", "acquired_xp": 500, "key": 3})
arr.append({"name": "C", "acquired_xp": 750, "key": 4})
arr.append({"name": "A", "acquired_xp": 300, "key": 5})

이렇게 Dictionary로 이루어진 리스트가 있고, acquired_xp항목을 이름에 따라 더하려고 한다.
key는 고유값이므로 더하면 안되며, 첫번째로 만나는 key값을 기준으로 더해야한다.
원하는 결과 값은 다음과 같다.

원하는 결과

name  acquired_xp  key
A             500    1
B            1000    2
C             750    4

여러가지 짱구를 굴려봤는데 역시 Pandas를 사용하면 가장 편하다.

해결방법 1

df = pd.DataFrame(arr)
df = df.groupby('name', as_index=False, sort=False).agg({'acquired_xp': 'sum', 'key': 'first'})
df_dict = df.to_dict('records') 
print(df_dict)
# [{'name': 'A', 'acquired_xp': 500, 'key': 1}, 
# {'name': 'B', 'acquired_xp': 1000, 'key': 2}, 
# {'name': 'C', 'acquired_xp': 750, 'key': 4}]

위 방법은 acquired_xp 컬럼은 더하고, key 항목은 첫번째를 사용하는 것이다.
별문제는 없어보이지만, 1번째 아이템처럼 추가로 data라는 항목이 들어있을 경우 생략된다. 컬럼이 아주 많다면? 일일히 적어줘야하는 문제가 생긴다.

해결방법2

df = pd.DataFrame(arr)
df = df.groupby('name', as_index=False, sort=False).agg((lambda x: x.sum() if x.name == 'acquired_xp' else x.head(1)))
df_dict = df.to_dict('records') 
print(df_dict)
# [{'name': 'A', 'acquired_xp': 500, 'key': 1, 'data': 1.0}, 
# {'name': 'B', 'acquired_xp': 1000, 'key': 2, 'data': nan}, 
# {'name': 'C', 'acquired_xp': 750, 'key': 4, 'data': nan}]

lambda를 이용해 모든 컬럼의 값을 넣되, acquired_xp 항목의 경우 더하도록 한다. 이렇게하면 방법 1의 문제를 해결할 수 있다.