2017-11-29 4 views
1

두 개의 팬더 데이터 프레임을 여러 개의 중복되는 열과 병합했습니다. 겹치는 열을 나란히 놓고 싶습니다.python pandas 병합 후 열 정렬

merge = df1.merge(df2, how='outer') 

출력 : I 출력이되고 싶습니다

A,B,C,D,A_x,B_x,C_x,D_x 

:

A,A_x,B,B_x,C,C_x,D,D_x 

내가 명시 적으로이 작업을 수행 할 수 있지만 나는 많은 열이 있고 '동적'솔루션을하고 싶습니다.

답변

3

사용 .sort_index(axis=1) :

df[sorted(df.columns)] 

그 이유는 경우입니다 : MaxU의 대답은 바로 하나 여기에있을 수도 있지만

result = df1.merge(df2, how='outer').sort_index(axis=1) 
1

, 당신은 항상 병합 후 다음 을 사용할 수 있습니다 다른 키 (람다 포함)를 사용하고 싶습니다 :

df[sorted(df.columns,key=lambda x: x[1:])] 

예 :

import pandas as pd 

cols = 'A,B,C,D,A_x,B_x,C_x,D_x'.split(',') 

df = pd.DataFrame(columns=cols) 
df.loc[0] = list(range(len(cols))) 
df[sorted(df.columns)] 

결과 :

A A_x B B_x C C_x D D_x 
0 0 4 1 5 2 6 3 7 
+1

오! 나는 그것을 얻었고, 당신은 그것을 적용하기를 원한다. 그것은 (두 번째 단계에서) 병합되었다. 그러면 – MaxU

+1

@MaxU 옙이 작동 할 것이고, .tolist()는 필요 없기 때문에 제거했다. 나는 또한 당신이 그것을하는 것을 분명히했다. –

0

열 수 있습니다 순서를 변경하는 또 다른, 아마도 일반, 솔루션 -

cols_order = ['A', 'A_x' , 'B' , 'B_x', 'C' , 'C_x', 'D', 'D_x'] 
merge = merge[cols_order] 

이 단순히 따라 열의 순서로 dataframe를 다시 작성합니다 목록의 순서 인 cols_order로 이동합니다.

1
# Create initial random data. 
np.random.seed(0) 
df1 = pd.DataFrame(np.random.randn(5, 3), columns=list('ABx')) 
df2 = pd.DataFrame(np.random.randn(5, 3), columns=list('ABy')) 
df = df1.merge(df2, how='outer', suffixes=['', '_x'], left_index=True, right_index=True) 


col_order = [] 
common_columns = df1.columns & df2.columns 
for c in common_columns: 
    col_order.append(c) 
    col_order.append(c + '_x') 
# Add non-common columns to right side of dataframe. 
col_order.extend([c for c in df if c not in common_columns and not c.endswith('_x')]) 
>>> df[col_order] 
      A  A_x   B  B_x   x   y 
0 1.764052 0.333674 0.400157 1.494079 0.978738 -0.205158 
1 2.240893 0.313068 1.867558 -0.854096 -0.977278 -2.552990 
2 0.950088 0.653619 -0.151357 0.864436 -0.103219 -0.742165 
3 0.410599 2.269755 0.144044 -1.454366 1.454274 0.045759 
4 0.761038 -0.187184 0.121675 1.532779 0.443863 1.469359 
관련 문제