python(jython 2.7) 에서 list-dict 타입 같은 키 값끼리 count 또는 sum 하는 방법이 있을까요?
조회수 388회
저번에 list-dict 형태의 데이터에서 같은 value끼리 묶어서 카운트하는 방법 질문 드렸었는데 반대로 같은 키값 여러개를 카운트 시키려면 어떻게 해야할까요? 참고로 자이썬 2.7 에서는 **가먹질 않네요..
origin = [
{ 'pk':'1', 'a':1, 'b':0, 'c':0, 'd':0, 'e':1 , 'date':'20210308'},
{ 'pk':'1', 'a':0, 'b':0, 'c':0, 'd':0, 'e':1 , 'date':'20210308'},
{ 'pk':'1', 'a':1, 'b':0, 'c':0, 'd':0, 'e':1 , 'date':'20210308'},
{ 'pk':'1', 'a':0, 'b':0, 'c':0, 'd':0, 'e':1 , 'date':'20210308'},
{ 'pk':'1', 'a':1, 'b':2, 'c':0, 'd':0, 'e':1 , 'date':'20210308'},
{ 'pk':'2', 'a':0, 'b':0, 'c':0, 'd':0, 'e':1 , 'date':'20210308'},
{ 'pk':'2', 'a':0, 'b':0, 'c':0, 'd':0, 'e':0 , 'date':'20210308'},
]
희망 결과>
[
{ 'pk':'1', 'a':3, 'b':2, 'c':0, 'd':0, 'e':5 , 'date':'20210308'},
{ 'pk':'2', 'a':0, 'b':0, 'c':0, 'd':0, 'e':1 , 'date':'20210308'}
]
3 답변
-
pandas groupby 로 하는 게 가장 간단한 방법입니다. 단, 지난 질문에서도 pandas 는 못쓴다고 했던 것 같아서...
그냥 같은 방식으로 하면 됩니다.
테이블형태로 컬럼명이 일정한 데이터라고 가정하겠습니다.
from pprint import pprint origin = [ {"pk": "1", "a": 1, "b": 0, "c": 0, "d": 0, "e": 1, "date": "20210308"}, {"pk": "1", "a": 0, "b": 0, "c": 0, "d": 0, "e": 1, "date": "20210308"}, {"pk": "1", "a": 1, "b": 0, "c": 0, "d": 0, "e": 1, "date": "20210308"}, {"pk": "1", "a": 0, "b": 0, "c": 0, "d": 0, "e": 1, "date": "20210308"}, {"pk": "1", "a": 1, "b": 2, "c": 0, "d": 0, "e": 1, "date": "20210308"}, {"pk": "2", "a": 0, "b": 0, "c": 0, "d": 0, "e": 1, "date": "20210308"}, {"pk": "2", "a": 0, "b": 0, "c": 0, "d": 0, "e": 0, "date": "20210308"}, ] sum_dict: dict = {} columns = ["a", "b", "c", "d", "e"] for dat in origin: sum_ = sum_dict.get(dat["pk"], {col: 0 for col in columns}) sum_ = {col: sum_[col] + dat[col] for col in columns} sum_dict[dat["pk"]] = sum_ pprint(sum_dict) # {'1': {'a': 3, 'b': 2, 'c': 0, 'd': 0, 'e': 5}, # '2': {'a': 0, 'b': 0, 'c': 0, 'd': 0, 'e': 1}} res = [] for key, val in sum_dict.items(): r = {"pk": key} r.update(val) res.append(r) pprint(res) # [{'a': 3, 'b': 2, 'c': 0, 'd': 0, 'e': 5, 'pk': '1'}, # {'a': 0, 'b': 0, 'c': 0, 'd': 0, 'e': 1, 'pk': '2'}]
-
스탠다드 모듈에 groupby 가 구현되어 있습니다.
origin = [ {"pk": "1", "a": 1, "b": 0, "c": 0, "d": 0, "e": 1, "date": "20210308"}, {"pk": "1", "a": 0, "b": 0, "c": 0, "d": 0, "e": 1, "date": "20210308"}, {"pk": "1", "a": 1, "b": 0, "c": 0, "d": 0, "e": 1, "date": "20210308"}, {"pk": "1", "a": 0, "b": 0, "c": 0, "d": 0, "e": 1, "date": "20210308"}, {"pk": "1", "a": 1, "b": 2, "c": 0, "d": 0, "e": 1, "date": "20210308"}, {"pk": "2", "a": 0, "b": 0, "c": 0, "d": 0, "e": 1, "date": "20210308"}, {"pk": "2", "a": 0, "b": 0, "c": 0, "d": 0, "e": 0, "date": "20210308"}, ] import itertools as it from functools import reduce import operator as op [{'pk':key[0], **reduce(lambda a, b: {k: a[k] + b[k] for k in a if k not in ['pk', 'date']}, grouped), 'date':key[1]} for key, grouped in it.groupby(origin, op.itemgetter('pk', 'date'))] [{'pk': '1', 'a': 3, 'b': 2, 'c': 0, 'd': 0, 'e': 5, 'date': '20210308'}, {'pk': '2', 'a': 0, 'b': 0, 'c': 0, 'd': 0, 'e': 1, 'date': '20210308'}]
-
값이 고정이라면 이런 방식으로 진행할 수 있지 않을까요?
origin = [ { 'pk':'1', 'a':1, 'b':0, 'c':0, 'd':0, 'e':1 , 'date':'20210308'}, { 'pk':'1', 'a':0, 'b':0, 'c':0, 'd':0, 'e':1 , 'date':'20210308'}, { 'pk':'1', 'a':1, 'b':0, 'c':0, 'd':0, 'e':1 , 'date':'20210308'}, { 'pk':'1', 'a':0, 'b':0, 'c':0, 'd':0, 'e':1 , 'date':'20210308'}, { 'pk':'1', 'a':1, 'b':2, 'c':0, 'd':0, 'e':1 , 'date':'20210308'}, { 'pk':'2', 'a':0, 'b':0, 'c':0, 'd':0, 'e':1 , 'date':'20210308'}, { 'pk':'2', 'a':0, 'b':0, 'c':0, 'd':0, 'e':0 , 'date':'20210308'}, ] f = [] for i in origin: pk = i['pk'] if pk not in f: f.append(pk) g = [] for i in f: h = {'pk':i, 'a':0, 'b':0, 'c':0, 'd':0, 'e':0} for j in origin: if j['pk'] == i: h['a'] += j['a'] h['b'] += j['b'] h['c'] += j['c'] h['d'] += j['d'] h['e'] += j['e'] g.append(h) print(g) >> [{'pk': '1', 'a': 3, 'b': 2, 'c': 0, 'd': 0, 'e': 5}, {'pk': '2', 'a': 0, 'b': 0, 'c': 0, 'd': 0, 'e': 1}]
댓글 입력