pandas 그룹별 빈도 세는 방법 질문드립니다.

조회수 1582회

파이썬에서 데이터가 아래 표와 같이 구성되어 있는 경우에 그룹별 단어 빈도수 세는 방법을 질문드립니다.

이미지

category별로 내용을 통합한 후 중복을 제거해서

A: apple, orange, banana, melon (4개)

B: peach, apple, orange (3개)

이런 내용의 결과물을 출력하고 싶습니다.

pandas의 groupby와 value_count를 한번에 쓰는 방법이 있을까요?

아니면 할수있는 다른 방법이 있을까요?

1 답변

  • 좋아요

    1

    싫어요
    채택 취소하기
    >>> df = pd.DataFrame({"category":["A", "A", "B"], "content":["apple, orange", "banana, apple, melon", "peach, apple, orange" ]})
    >>> df
      category               content
    0        A         apple, orange
    1        A  banana, apple, melon
    2        B  peach, apple, orange
    >>> df["content"] = df["content"].str.split(", ")
    >>> df
      category                 content
    0        A         [apple, orange]
    1        A  [banana, apple, melon]
    2        B  [peach, apple, orange]
    >>> df["content"] = df["content"].apply(set)
    >>> df
      category                 content
    0        A         {orange, apple}
    1        A  {melon, banana, apple}
    2        B  {peach, orange, apple}
    >>> df.groupby("category").apply(lambda x: set.union(*x.content))
    category
    A    {melon, banana, orange, apple}
    B            {peach, orange, apple}
    dtype: object
    >>> group_df = df.groupby("category").apply(lambda x: set.union(*x.content))
    >>> for tup in group_df.to_frame().itertuples():
        tup1_str = ", ".join(sorted(tup[1]))
        n = len(tup[1])
        print(f"{tup[0]}: {tup1_str} ({n}개)")
    
    
    A: apple, banana, melon, orange (4개)
    B: apple, orange, peach (3개)
    
    1. content 컬럼을 , 로 split 하여 list 로 만듦.
    2. set 을 apply 하여 list 를 set 으로 바꿈. (이후 합칠 때 중복제거를 위해서)
    3. category 로 groupby 하고, content 컬럼들에 대해 set.union (합집합) 연산으로 묶음.
    4. 만들어진 결과를 dataframe 으로 바꾸고 itertuples 로 이터레이트하면서 각 결과를 예쁘게 출력.
    • 깔끔하고 친절한 설명 감사드립니다! 덕분에 문제 해결했습니다. 고맙습니다 ^^ orange 2020.10.5 17:49

답변을 하려면 로그인이 필요합니다.

프로그래머스 커뮤니티는 개발자들을 위한 Q&A 서비스입니다. 로그인해야 답변을 작성하실 수 있습니다.

(ಠ_ಠ)
(ಠ‿ಠ)