Pandas DataFrame에서 열을 여러 행으로 중첩 해제하는 방법
문제:
하나의 열에 값 목록이 포함된 DataFrame이 있고 각 목록 요소를 분리하려고 합니다.
해결책:
Pandas DataFrame에서 열을 중첩 해제(또는 분해)하는 방법에는 여러 가지가 있습니다.
방법 1: 폭발 사용(Pandas >= 0.25)
중첩 해제할 단일 열이 있는 경우 분해 기능이 가장 간단한 솔루션입니다.
df.explode('B')
방법 2: Apply 및 pd.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: reindex 또는 loc
중첩되지 않은 값으로 새 DataFrame을 생성하고 reindex 또는 loc를 사용하여 원본과 정렬합니다.
df.reindex(df.index.repeat(df.B.str.len())).assign(B=np.concatenate(df.B.values))
방법 5: collections.ChainMap 사용( 목록에 고유한 항목이 포함된 경우 값)
from collections import ChainMap d = dict(ChainMap(*map(dict.fromkeys, df['B'], df['A']))) pd.DataFrame(list(d.items()),columns=df.columns[::-1])
방법 6: 고성능을 위해 Numpy 사용
이 방법은 이전 방법보다 더 효율적입니다.
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.cycle 사용 및 itertools.chain
재미를 위한 순수 Python 솔루션:
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)
여러 열로 일반화:
다음 함수를 사용하면 다음을 수행할 수 있습니다. 여러 열의 중첩을 해제합니다. DataFrame:
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 생성자의 add_prefix 메서드를 사용하세요.
df.join(pd.DataFrame(df.B.tolist(),index=df.index).add_prefix('B_'))
위 내용은 Pandas DataFrame 열을 여러 행으로 중첩 해제하는 방법은 무엇입니까?의 상세 내용입니다. 자세한 내용은 PHP 중국어 웹사이트의 기타 관련 기사를 참조하세요!