문제
| 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의 문제를 해결할 수 있다.