2017-12-27 19 views
3

실수로이 질문을 잘못된 복제본에 대한 링크와 함께 닫았습니다. 다음은 올바른 것입니다 : Pandas split column of lists into multiple columns.리스트 또는 튜플을 포함하는 팬더 열을 여러 열로 추출하는 가장 좋은 방법

df1 = pd.DataFrame(
{'vals': [['a', 'b', 'c', 'd'],['e','f','g','h']]} 
) 

즉 :

vals 
0 [a, b, c, d] 
1 [e, f, g, h] 

I 추가한다고 가정

I 한 컬럼 또는 튜플 (공지 및 동일한 길이), 예를 들면리스트 인의 dataframe을 "vals"의 값을 별도의 명명 된 열로 변환합니다.

for i in range(df1.shape[0]): 
    for j in range(0,4): 
     df1.loc[i, 'vals_'+j] = df1.loc[i, 'vals'] [j] 

결과를 원하는대로 : 나는 행을 반복하여 서투르게이 작업을 수행 할 수 있습니다

vals   vals_0 vals_1 vals_2 vals_3 
0 [a, b, c, d] a  b  c  d 
1 [e, f, g, h] e  f  g  h 

깔끔한 (벡터화) 방법이 있나요? []을 사용했지만 오류가 발생했습니다.

for j in range (0,4) 
     df1['vals_'+str(j)] = df1['vals'][j] 

준다 : 팬더 직렬/dataframe보다는 열 함량에 [] 연산자를 적용하려고 같이

ValueError: Length of values does not match length of index 

것 같습니다.

+1

'df1.vals.apply (pd.Series)'는 대부분의 방법을 제공합니다. –

+1

@ andrew_reece 벡터화 된 것입니까? 그는 4 개의 다른 시리즈를 만들어야 할 것입니다. – FredMan

답변

5

pd.Seriesassign, apply 사용할 수

df1.assign(**df1.vals.apply(pd.Series).add_prefix('val_')) 

이상의 데이터에 대한 더 빠른 방법으로 .values ​​및 tolist()를 사용하는 dataframe 생성자 :

df1.assign(**pd.DataFrame(df1.vals.values.tolist()).add_prefix('val_')) 

출력 :

,536,
  vals val_0 val_1 val_2 val_3 
0 [a, b, c, d]  a  b  c  d 
1 [e, f, g, h]  e  f  g  h 
+1

woah, nice kwarg-fu @ Scott Boston! –

+1

두 번째 방법은 열 이름 바꾸기를 포함한 모든 작업을 한 줄로 처리하는 방식이 좋습니다. –

5

이니셜 라이저를 vals에 적용한 다음 add_prefix에 적용하여 원하는 열 이름을 얻을 수 있습니다. 이어서 concat 원하는 출력에 대한 원래 :

pd.concat([df1.vals, df1.vals.apply(pd.Series).add_prefix("vals_")], axis=1) 

      vals vals_0 vals_1 vals_2 vals_3 
0 [a, b, c, d]  a  b  c  d 
1 [e, f, g, h]  e  f  g  h