2016-11-10 12 views
1

我想連接兩個數據幀,從兩個列表創建:追加2個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 

不過,我想我的數值列出現在有序,是不知道是否有比分裂掉前兩列,排序剩餘的數據幀,並再次串聯兩個更簡單的方法:

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 

我想過多指標,但我已經在使用的東西指數其他(數據行的來源,這裏沒有顯示),我是afra如果一個三級多索引可能會使它稍後更復雜一些。

回答

1

步驟:

使列的索引和值等於索引鍵的序列表示。

使用pd.to_numericerrors=coerce,以正確解析數值和處理字符串值爲Nans

排序這些值時,將Nans(它們之前是字符串值)推到頂部,並在遇到它們時排序。

取其相應的索引並根據這些新返回的列標籤重新排列DF

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類型排序,你可以做的是列篩選到strnumerical類型,該類型numerical和排序然後reindex新列的順序與STR類型在與排序的數值列串連開頭:

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