복붙노트

[PYTHON] 복제로 데이터 정규화

PYTHON

복제로 데이터 정규화

참고 :이 질문은 실제로 분할 판다 데이터 프레임 문자열 항목을 별도의 행으로 복제 한 것입니다. 그러나 여기에 제공된 대답은 좀 더 일반적이고 유익합니다. 따라서 모든 점을 고려하여 스레드를 삭제하지 않기로했습니다.

다음 형식으로 '데이터 집합'이 있습니다.

     id | value | ...
--------|-------|------
      a | 156   | ...
    b,c | 457   | ...
e,g,f,h | 346   | ...
    ... | ...   | ...

그리고 각 id에 대한 모든 값을 복제하여 정규화하고 싶습니다.

     id | value | ...
--------|-------|------
      a | 156   | ...
      b | 457   | ...
      c | 457   | ...
      e | 346   | ...
      g | 346   | ...
      f | 346   | ...
      h | 346   | ...
    ... | ...   | ...

내가하고있는 일은 각 그룹 (groupby 값, pd.DataFrame ())에 대해 튜플을 만드는 .groupby를 사용하여 팬다 분할 적용 적용 원칙을 적용하는 것입니다.

그룹화 할 열을 만들었습니다. 단순히 행의 ID를 계산합니다.

df['count_ids'] = df['id'].str.split(',').apply(lambda x: len(x))

     id | value | count_ids
--------|-------|------
      a | 156   | 1
    b,c | 457   | 2
e,g,f,h | 346   | 4
    ... | ...   | ...

행을 복제하는 방법은 다음과 같습니다.

pd.DataFrame().append([group]*count_ids)

천천히 진행하고 있지만 실제로 복잡하기 때문에 이러한 유형의 문제를 공유 할 수있는 모범 사례 또는 권장 사항을 알려 주시면 감사하겠습니다.

해결법

  1. ==============================

    1.이 시도:

    이 시도:

    In [44]: df
    Out[44]:
            id  value
    0        a    156
    1      b,c    457
    2  e,g,f,h    346
    
    In [45]: (df['id'].str.split(',', expand=True)
       ....:          .stack()
       ....:          .reset_index(level=0)
       ....:          .set_index('level_0')
       ....:          .rename(columns={0:'id'})
       ....:          .join(df.drop('id',1), how='left')
       ....: )
    Out[45]:
      id  value
    0  a    156
    1  b    457
    1  c    457
    2  e    346
    2  g    346
    2  f    346
    2  h    346
    

    설명:

    In [48]: df['id'].str.split(',', expand=True).stack()
    Out[48]:
    0  0    a
    1  0    b
       1    c
    2  0    e
       1    g
       2    f
       3    h
    dtype: object
    
    In [49]: df['id'].str.split(',', expand=True).stack().reset_index(level=0)
    Out[49]:
       level_0  0
    0        0  a
    0        1  b
    1        1  c
    0        2  e
    1        2  g
    2        2  f
    3        2  h
    
    In [50]: df['id'].str.split(',', expand=True).stack().reset_index(level=0).set_index('level_0')
    Out[50]:
             0
    level_0
    0        a
    1        b
    1        c
    2        e
    2        g
    2        f
    2        h
    
    In [51]: df['id'].str.split(',', expand=True).stack().reset_index(level=0).set_index('level_0').rename(columns={0:'id'})
    Out[51]:
            id
    level_0
    0        a
    1        b
    1        c
    2        e
    2        g
    2        f
    2        h
    
    In [52]: df.drop('id',1)
    Out[52]:
       value
    0    156
    1    457
    2    346
    
  2. from https://stackoverflow.com/questions/39078282/normalizing-data-by-duplication by cc-by-sa and MIT license