2017-04-24 1 views
2

반복 행이있는 데이터 프레임의 모양을 변경하려고합니다. 데이터는 데이터 블록이 반복되는 CSV 파일에서 가져옵니다. 예를 들어 Pandas 반복 행 재 형성

는 :

Name  1st 2nd 3rd 4th 
Value1 a1 b1 a4 b4 
Value2 a2 b2 a5 b5 
Value3 a3 b3 a6 b6 

이 작업을 수행하는 방법 당신이 어떤 제안이 있습니까 :

Name  1st 2nd 
0 Value1  a1  b1 
1 Value2  a2  b2 
2 Value3  a3  b3 
3 Value1  a4  b4 
4 Value2  a5  b5 
5 Value3  a6  b6 

로 재편한다? 나는이 thread을 이미 보았지만,이 접근법을 내 문제로 변환하는 방법을 볼 수는 없습니다.이 문제는 groupby가 작업중인 열의 오른쪽에 두 개 이상의 열이있는 경우에 발생합니다.

당신은 재 형성 할 pivot을 새로운 열 레이블을 얻기 위해, 하나에 cumcount를하여 두 개의 열을 결합 set_indexstack을 사용하고 있습니다

답변

3

:

# Stack the 1st and 2nd columns, and use cumcount to get the new column labels. 
df = df.set_index('Name').stack().reset_index(level=1, drop=True).to_frame() 
df['new_col'] = df.groupby(level='Name').cumcount() 

# Perform a pivot to get the desired shape. 
df = df.pivot(columns='new_col', values=0) 

# Formatting. 
df = df.reset_index().rename_axis(None, 1) 

결과 출력 :

 Name 0 1 2 3 
0 Value1 a1 b1 a4 b4 
1 Value2 a2 b2 a5 b5 
2 Value3 a3 b3 a6 b6 
1

이름별로 그룹화 한 후 df의 값을 반복하여 데이터 프레임을 만들고 해당 df를 원본과 병합합니다.

df1 = df.groupby('Name')['1st', '2nd'].apply(lambda x: x.iloc[1]).reset_index() 
df1.columns = ['Name', '3rd', '4th'] 
df = df.drop_duplicates(subset=['Name']).merge(df1, on = 'Name') 

당신은

Name 1st 2nd 3rd 4th 
0 Value1 a1 b1 a4 b4 
1 Value2 a2 b2 a5 b5 
2 Value3 a3 b3 a6 b6 
를 얻을 수