문제
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의 문제를 해결할 수 있다.
'프로그래밍 > Python' 카테고리의 다른 글
[Windows] mysqlclient 설치하기 (pip install mysqlclient) (0) | 2022.05.28 |
---|---|
[Windows] Python virtual envorinment 활성화 하기 (0) | 2022.05.28 |
Python 정규식 그룹명으로 match 결과 가져오기 (group name) (0) | 2022.05.07 |
Falcon req.get_param()으로 모든 파라미터를 받아보자 (0) | 2022.04.06 |
Python 프로젝트 패키지 관리하기: pip freeze requirements.txt (0) | 2021.09.18 |