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 중국어 웹사이트의 기타 관련 기사를 참조하세요!