> 백엔드 개발 > 파이썬 튜토리얼 > Pandas DataFrames에서 목록 포함 열을 중첩 해제하는 방법은 무엇입니까?

Pandas DataFrames에서 목록 포함 열을 중첩 해제하는 방법은 무엇입니까?

Barbara Streisand
풀어 주다: 2024-12-20 22:58:14
원래의
899명이 탐색했습니다.

How to Unnest List-Containing Columns in Pandas DataFrames?

Pandas DataFrame의 열을 여러 행으로 중첩 해제(폭발)하는 방법

Pandas에서 열이 다음과 같은 상황에 직면할 수 있습니다. 목록이나 개체를 요소로 포함합니다. 이러한 열을 개별 행으로 변환하려면 "중첩 해제" 또는 "폭발"이라는 프로세스가 필요합니다. 이를 통해 데이터를 보다 효과적으로 시각화하고 분석할 수 있습니다.

문제:

'B' 열 중 하나에 목록이 포함된 DataFrame을 생각해 보세요.

df = pd.DataFrame({'A': [1, 2], 'B': [[1, 2], [1, 2]]})

   A       B
0  1  [1, 2]
1  2  [1, 2]
로그인 후 복사

예상 출력:

원하는 출력은 'B' 열의 각 요소가 별도의 행으로 표시되는 DataFrame입니다.

   A  B
0  1  1
1  1  2
3  2  1
4  2  2
로그인 후 복사

해결책:

방법 1: 분해 기능

Pandas 버전 0.25부터 중첩 해제를 위해 pandas.DataFrame.explode 함수를 사용할 수 있습니다. 이 함수는 특정 열을 효율적으로 분해하여 각 목록 요소에 대해 새 행을 생성합니다.

df.explode('B')

   A  B
0  1  1
1  1  2
0  2  1
1  2  2
로그인 후 복사

방법 2: pd.Series 적용

또 다른 접근 방식은 적용을 결합하는 것입니다. pd.Series를 사용하여 기능을 수행합니다. 이 방법은 'B' 열의 각 행을 처리하고 해당 요소를 별도의 Series 객체로 분할합니다.

df.set_index('A').B.apply(pd.Series).stack().reset_index(level=0).rename(columns={0:'B'})
로그인 후 복사

방법 3: DataFrame 생성자

또는 다음을 수행할 수 있습니다. DataFrame 생성자를 사용하여 데이터의 모양을 변경합니다. 여기에는 목록의 요소 수와 일치하도록 행 인덱스를 반복하고 이를 단일 열로 연결하는 작업이 포함됩니다.

df = pd.DataFrame({'A':df.A.repeat(df.B.str.len()), 'B':np.concatenate(df.B.values)})
로그인 후 복사

방법 4: 재색인 또는 loc

reindex 또는 loc를 사용하면 폭발된 값을 수용하도록 DataFrame을 확장할 수 있습니다. 누락된 값을 'B' 열의 요소로 채웁니다.

df.reindex(df.index.repeat(df.B.str.len())).assign(B=np.concatenate(df.B.values))
로그인 후 복사

방법 5: 목록 이해

간결한 방법은 다음을 사용하여 목록 목록을 생성하는 것입니다. 이해력을 나열한 다음 이를 다음으로 변환합니다. DataFrame.

pd.DataFrame([[x] + [z] for x, y in df.values for z in y],columns=df.columns)
로그인 후 복사

방법 6: Numpy

성능 집약적인 시나리오의 경우 numpy는 벡터화된 작업을 제공합니다. 이 방법은 np.dstack을 사용하여 데이터를 재구성하고 새 DataFrame을 생성합니다.

newvalues=np.dstack((np.repeat(df.A.values,list(map(len,df.B.values))),np.concatenate(df.B.values)))
pd.DataFrame(data=newvalues[0],columns=df.columns)
로그인 후 복사

방법 7: Itertools

itertools 패키지를 활용하면 요소를 결합하여 새로운 요소를 만듭니다. DataFrame.

from itertools import cycle, chain
l=df.values.tolist()
l1=[list(zip([x[0]], cycle(x[1])) if len([x[0]]) > len(x[1]) else list(zip(cycle([x[0]]), x[1]))) for x in l]
pd.DataFrame(list(chain.from_iterable(l1)),columns=df.columns)
로그인 후 복사

여러 열로 일반화:

이러한 방법을 여러 열로 확장하려면 열 이름을 입력으로 사용하고 중첩 해제 작업을 수행합니다.

def unnesting(df, explode):
    idx = df.index.repeat(df[explode[0]].str.len())
    df1 = pd.concat([pd.DataFrame({x: np.concatenate(df[x].values)}) for x in explode], axis=1)
    df1.index = idx

    return df1.join(df.drop(explode, 1), how='left')
로그인 후 복사

열별 중첩 해제:

수평으로 "중첩 해제"(즉, 요소를 연속으로 확장)하려는 경우 DataFrame 생성자를 사용할 수 있습니다.

df.join(pd.DataFrame(df.B.tolist(),index=df.index).add_prefix('B_'))
로그인 후 복사

결론:

이러한 방법은 Pandas DataFrames에서 데이터 중첩을 해제하기 위한 유연한 옵션을 제공합니다. 성능 및 가독성 요구 사항에 가장 적합한 접근 방식을 선택하세요.

위 내용은 Pandas DataFrames에서 목록 포함 열을 중첩 해제하는 방법은 무엇입니까?의 상세 내용입니다. 자세한 내용은 PHP 중국어 웹사이트의 기타 관련 기사를 참조하세요!

원천:php.cn
본 웹사이트의 성명
본 글의 내용은 네티즌들의 자발적인 기여로 작성되었으며, 저작권은 원저작자에게 있습니다. 본 사이트는 이에 상응하는 법적 책임을 지지 않습니다. 표절이나 침해가 의심되는 콘텐츠를 발견한 경우 admin@php.cn으로 문의하세요.
저자별 최신 기사
인기 튜토리얼
더>
최신 다운로드
더>
웹 효과
웹사이트 소스 코드
웹사이트 자료
프론트엔드 템플릿