Pandas 데이터 프레임 문자열 항목을 별도의 행으로 분할(분해)
문제:
Pandas 데이터 프레임 조작 쉼표로 구분된 값의 열을 포함하는 경우 목표는 각 CSV 필드를 다음으로 분할하는 것입니다. 원래 데이터 구조를 유지하면서 개별 행을 삭제합니다.
해결책:
권장되는 해결 방법은 Pandas Series.explode() 또는 DataFrame.explode() 메서드를 활용하는 것입니다. Pandas 0.25.0에 도입되었으며 Pandas 1.3.0에서 다중 열을 지원하도록 향상되었습니다. 폭발합니다.
단일 열을 분해하려면 Series.explode()를 사용합니다.
df.explode('column_name')
여러 열의 경우 다음을 사용합니다. DataFrame.explode():
df.explode(['column1', 'column2'])
예:
df = pd.DataFrame({ 'A': [[0, 1, 2], 'foo', [], [3, 4]], 'B': 1, 'C': [['a', 'b', 'c'], np.nan, [], ['d', 'e']] }) df.explode('A')
출력:
A B C 0 0 1 [a, b, c] 0 1 1 [a, b, c] 0 2 1 [a, b, c] 1 foo 1 NaN 2 NaN 1 [] 3 3 1 [d, e] 3 4 1 [d, e]
여러 일반 및 목록 열에 작동하는 보다 일반적인 접근 방식 , 다음 기능을 고려하세요.
def explode(df, lst_cols, fill_value='', preserve_index=False): # Ensure `lst_cols` is list-alike if lst_cols and not isinstance(lst_cols, (list, tuple, np.ndarray, pd.Series)): lst_cols = [lst_cols] # Calculate lengths of lists lens = df[lst_cols[0]].str.len() # Preserve original index values idx = np.repeat(df.index.values, lens) # Create an "exploded" DataFrame res = (pd.DataFrame({ col:np.repeat(df[col].values, lens) for col in df.columns.difference(lst_cols) }, index=idx) .assign(**{col:np.concatenate(df.loc[lens>0, col].values) for col in lst_cols})) # Append rows with empty lists if (lens == 0).any(): res = (res.append(df.loc[lens==0, df.columns.difference(lst_cols)], sort=False) .fillna(fill_value)) # Revert to original index order and reset if requested res = res.sort_index() if not preserve_index: res = res.reset_index(drop=True) return res
CSV와 같은 폭발의 예 열:
df = pd.DataFrame({ 'var1': 'a,b,c d,e,f,x,y'.split(), 'var2': [1, 2] }) explode(df.assign(var1=df.var1.str.split(',')), 'var1')
출력:
var1 var2 0 a 1 1 b 1 2 c 1 3 d 2 4 e 2 5 f 2 6 x 2 7 y 2
위 내용은 Pandas DataFrame의 쉼표로 구분된 값을 별도의 행으로 분할하는 방법은 무엇입니까?의 상세 내용입니다. 자세한 내용은 PHP 중국어 웹사이트의 기타 관련 기사를 참조하세요!