2016-11-10 43 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