2016-11-10 6 views
1
나는이 목록에서 만든 두 개의 데이터 프레임을 연결하는 싶습니다

: 내 수치 열이 정렬 된 순서에 표시 할을하지만이 DataFrames을 덧붙이와의 제외 열을 정렬 처음 두

import pandas as pd 
import numpy as np 

header_1 = ['A', 'B', -1, 3, 5, 7] 
data_1 = ['X', 'Y', 1, 2, 3, 4] 
d = pd.DataFrame(np.array([data_1]), columns=header_1) 

header_2 = ['A', 'B', -2, 4, 5, 6] 
data_2 = ['X', 'Z', 1, 2, 3, 4] 
e = pd.DataFrame(np.array([data_2]), columns=header_2) 

f = pd.concat([d, e]) 

> f 
    A B -1 3 5 7 -2 4 6 
0 X Y 1 2 3 4 NaN NaN NaN 
0 X Z NaN NaN 3 NaN 1 2 4 

을이었다 궁금 경우가 첫 번째 두 개의 열을 분할 나머지 dataframe를 정렬하고 다시 두을 연결보다 쉬운 방법 :

ab_cols = f[['A', 'B']]    # Copy of first two columns 
g = f.drop(['A', 'B'], axis=1)  # Removing cols from dataframe 
h = g.sort_index(axis=1)    # Sort remaining by column header 
i = pd.concat([ab_cols, h], axis=1) # Putting everything together again 

> i 
    A B -2 -1 3 4 5 6 7 
0 X Y NaN 1 2 NaN 3 NaN 4 
0 X Z 1 NaN NaN 2 3 4 NaN 

I 멀티 인덱스에 대해 생각했지만, 이미 무언가에 대한 인덱스를 사용하고 있습니다 else (데이터 행의 출처, 여기에 표시되지 않음) 및 afra id는 3 레벨 다중 인덱스를 사용하여 나중에 데이터 프레임을 분할하기가 더 복잡해 질 수 있습니다.

답변

1

단계 :

인덱스 키와 동일한 인덱스와 값을 모두 사용하여 열을 시리즈로 만듭니다.

pd.to_numericerrors=coerce과 함께 사용하면 숫자 값을 올바르게 구문 분석하고 문자열 값을 Nans으로 처리 할 수 ​​있습니다.

Nans (앞에있는 문자열 값 이었음)을 맨 위에 놓으면 이들 값을 정렬하십시오.

새로 색인 된 열 레이블을 기반으로 의 해당 색인을 다시 배열합니다.

c = pd.to_numeric(f.columns.to_series(), errors='coerce').sort_values(na_position='first') 
f[c.index] 

Image

+1

감사합니다! 나는이 모든 매개 변수에 대해 몰랐다. 그것은 내가 찾고 있었던 바로 그 것이다. – fukiburi

+1

매우 흥미로운 해결책! – MaxU

0
당신은 아마 발견 한 것처럼 문제는 현재 연결된 열이 때문에 혼합 strint 유형으로 분류 할 수 없다는 것입니다

은, 당신이 할 수있는 것은 numerical 유형을 분류, strnumerical 유형에 열을 필터링하고 다음 정렬 된 숫자 열이 연결된 시작 부분에 STR 유형, 새로운 열 순서 reindex :

In [30]: 
numerical_cols = f.columns[f.columns.to_series().apply(lambda x: type(x) != str)] 
str_cols = f.columns[f.columns.to_series().apply(lambda x: type(x) == str)] 
f.reindex(columns=str_cols.union(numerical_cols.sort_values())) 

Out[30]: 
    A B -2 -1 3 4 5 6 7 
0 X Y NaN 1 2 NaN 3 NaN 4 
0 X Z 1 NaN NaN 2 3 4 NaN