본문 바로가기
공부/데이터

[pandas] 특정 key를 기준으로 groupby 한 후 해당목록 배열(dict)로 변경하기

by demonic_ 2020. 5. 30.
반응형

Grid 형식의 데이터에 Key를 지정하여 관련 값을 배열로 넣고 싶을떄 쓰면 된다.

 

여기서는 예로 주소를 썼다. 가령 서울시에 포함되는 구들을 배열로 만들고 싶은 경우다

아래 원본데이터와 변경하고 싶은 데이터를 보면 이해될 거 같다.

 

이번 포스팅을 수행하기 위해 샘플 파일을 여기 첨부해두겠다.

address-sample.csv
0.01MB

 

 

CSV 내 데이터 형태

바꾸고 싶은 문자형

{
    '광주광역시':	['광산구', '남구', '동구', '북구', '서구']
    ,'대구광역시':	['남구', '달서구', '달성군', '동구', '북구', '서구', '수성구', '중구']
    ,'대전광역시':	['대덕구', '동구', '서구', '유성구', '중구']
    ...
}    

 

그럼 pandas 를 켜서 다음을 수행한다.

sample = pd.read_csv('address-sample.csv')
sample.head(10)

 

그룹을 si 기준으로 묶고 gu 에 있는 목록은 List로 묶어 리턴한다

r_1.groupby(['si']).apply(lambda x: x.to_dict('r'))

결과

si
강원도        [{'si': '강원도', 'gu': '강릉시'}, {'si': '강원도', 'gu...
경기도        [{'si': '경기도', 'gu': '가평군'}, {'si': '경기도', 'gu...
경상남도       [{'si': '경상남도', 'gu': '거제시'}, {'si': '경상남도', '...
경상북도       [{'si': '경상북도', 'gu': '경산시'}, {'si': '경상북도', '...
광주광역시      [{'si': '광주광역시', 'gu': '광산구'}, {'si': '광주광역시',...
대구광역시      [{'si': '대구광역시', 'gu': '남구'}, {'si': '대구광역시', ...
대전광역시      [{'si': '대전광역시', 'gu': '대덕구'}, {'si': '대전광역시',...
부산광역시      [{'si': '부산광역시', 'gu': '강서구'}, {'si': '부산광역시',...
서울특별시      [{'si': '서울특별시', 'gu': '강남구'}, {'si': '서울특별시',...
울산광역시      [{'si': '울산광역시', 'gu': '남구'}, {'si': '울산광역시', ...
인천광역시      [{'si': '인천광역시', 'gu': '강화군'}, {'si': '인천광역시',...
전라남도       [{'si': '전라남도', 'gu': '강진군'}, {'si': '전라남도', '...
전라북도       [{'si': '전라북도', 'gu': '고창군'}, {'si': '전라북도', '...
제주특별자치도    [{'si': '제주특별자치도', 'gu': '서귀포시'}, {'si': '제주특별...
충청남도       [{'si': '충청남도', 'gu': '계룡시'}, {'si': '충청남도', '...
충청북도       [{'si': '충청북도', 'gu': '괴산군'}, {'si': '충청북도', '...

 

 

to_dict() 를 이용하면 다음과 같이 값이 리턴된다. 하지만 이 방식은 key값이 지정되는 것이기 떄문에 원하는 방법은 아니다.

 

그래서 이번엔 Custom 으로 기능을 만들어서 apply 에 적용시키면 된다.

toList라는 함수를 만든다

def toList(x):
    dic = x.to_dict('r')  // 목록에 있는 것을 dict 형태로 변경한다.
    result = []
    for item in dic:      // 내용중에 gu 값을 가져와서 배열에 저장한다
        result.append(item['gu'])
    return result         // 배열을 리턴한다
r_1.groupby(['si']).apply(lambda x: toList(x))

수행하면 다음과 같이 값이 리턴된다.

si
강원도        [강릉시, 고성군, 동해시, 삼척시, 속초시, 양구군, 양양군, 영월군, 원주시, ...
경기도        [가평군, 고양시 덕양구, 고양시 일산동구, 고양시 일산서구, 과천시, 광명시, 광...
경상남도       [거제시, 거창군, 고성군, 김해시, 남해군, 밀양시, 사천시, 산청군, 양산시, ...
경상북도       [경산시, 경주시, 고령군, 구미시, 군위군, 김천시, 문경시, 봉화군, 상주시, ...
광주광역시                                  [광산구, 남구, 동구, 북구, 서구]
대구광역시                    [남구, 달서구, 달성군, 동구, 북구, 서구, 수성구, 중구]
대전광역시                                 [대덕구, 동구, 서구, 유성구, 중구]
부산광역시      [강서구, 금정구, 기장군, 남구, 동구, 동래구, 부산진구, 북구, 사상구, 사하...
서울특별시      [강남구, 강동구, 강북구, 강서구, 관악구, 광진구, 구로구, 금천구, 노원구, ...
울산광역시                                  [남구, 동구, 북구, 울주군, 중구]
인천광역시       [강화군, 계양구, 남동구, 동구, 미추홀구, 부평구, 서구, 연수구, 옹진군, 중구]
전라남도       [강진군, 고흥군, 곡성군, 광양시, 구례군, 나주시, 담양군, 목포시, 무안군, ...
전라북도       [고창군, 군산시, 김제시, 남원시, 무주군, 부안군, 순창군, 완주군, 익산시, ...
제주특별자치도                                          [서귀포시, 제주시]
충청남도       [계룡시, 공주시, 금산군, 논산시, 당진시, 보령시, 부여군, 서산시, 서천군, ...
충청북도       [괴산군, 단양군, 보은군, 영동군, 옥천군, 음성군, 제천시, 증평군, 진천군, ...

끝.

 

 

 

stackoverflow.com/questions/52923685/convert-pandas-multiindex-series-to-json-python

 

convert pandas multiindex series to Json python

Hi I have two pandas series similar to below PnL Product Name Price Company A Orange 3000 Company B Apple 2000 Grapes 1000 Tax ...

stackoverflow.com

 

반응형

댓글