连接具有不同列排序的数据帧

时间:2016-03-02 15:47:28

标签: python-3.x pandas

我正在解析excel文件中的数据,结果DataFrame的列可能会或可能不会与我想要堆叠多个已解析的DataFrame的基座DataFrame对齐。

让我们从数据DataFrame和基地A DataFrame调用df_A我解析。

我读了一篇excel shee,结果是A=

Index                    AGUB  AGUG   MUEB   MUEB    SIL    SIL   SILB   SILB
2012-01-01 00:00:00      0.00     0   0.00  50.78   0.00   0.00   0.00   0.00
2012-01-01 01:00:00      0.00     0   0.00  53.15   0.00  53.15   0.00   0.00
2012-01-01 02:00:00      0.00     0   0.00   0.00  53.15  53.15  53.15  53.15
2012-01-01 03:00:00      0.00     0   0.00   0.00   0.00  55.16   0.00   0.00
2012-01-01 04:00:00      0.00     0   0.00   0.00   0.00   0.00   0.00   0.00
2012-01-01 05:00:00     48.96     0   0.00   0.00   0.00   0.00   0.00   0.00
2012-01-01 06:00:00      0.00     0   0.00   0.00   0.00   0.00   0.00   0.00
2012-01-01 07:00:00      0.00     0   0.00   0.00   0.00   0.00   0.00   0.00
2012-01-01 08:00:00      0.00     0   0.00   0.00   0.00   0.00   0.00   0.00
2012-01-01 09:00:00     52.28     0   0.00   0.00   0.00   0.00   0.00   0.00
2012-01-01 10:00:00      0.00     0   0.00   0.00   0.00   0.00   0.00   0.00
2012-01-01 11:00:00     36.93     0   0.00   0.00   0.00   0.00   0.00   0.00
2012-01-01 12:00:00      0.00     0   0.00   0.00   0.00   0.00   0.00   0.00
2012-01-01 13:00:00      0.00     0   0.00   0.00   0.00   0.00   0.00  50.00
2012-01-01 14:00:00      0.00     0   0.00   0.00   0.00   0.00   0.00  34.01
2012-01-01 15:00:00      0.00     0   0.00   0.00   0.00   0.00   0.00   0.00
2012-01-01 16:00:00      0.00     0   0.00   0.00   0.00   0.00   0.00   0.00
2012-01-01 17:00:00     53.00     0   0.00   0.00   0.00   0.00   0.00   0.00
2012-01-01 18:00:00      0.00    75   0.00  75.00   0.00  75.00   0.00   0.00
2012-01-01 19:00:00      0.00    70   0.00  70.00   0.00   0.00   0.00   0.00
2012-01-01 20:00:00      0.00     0   0.00   0.00   0.00   0.00   0.00   0.00
2012-01-01 21:00:00      0.00     0   0.00   0.00   0.00   0.00   0.00   0.00
2012-01-01 22:00:00      0.00     0   0.00   0.00   0.00   0.00   0.00   0.00
2012-01-01 23:00:00      0.00     0  53.45  53.45   0.00   0.00   0.00   0.00

我创建了基础数据框:

units = ['MUE', 'MUEB', 'SIL', 'SILB', 'AGUG', 'AGUB', 'MUEBP', 'MUELP']
df_A = pd.DataFrame(columns=units)
df_A = pd.concat([df_A, A], axis=0)

如果concat的列数少于A,则df_A通常会df_A。但是在这种情况下,列中唯一的区别就是订单。连接导致以下错误:

  

ValueError:计划形状未对齐

我想知道如何使用FIND_IN_SET给出的列顺序连接两个数据帧。

2 个答案:

答案 0 :(得分:4)

我已经尝试了这一点,无论源中是否有更多列,或目标定义的DataFrame都无关紧要 - 无论哪种方式,结果都是由所有提供的列的并集组成的数据帧(使用目标中指定的空列,但未填充NaN填充的源。

我能够重现您的错误的地方是源数据集或目标数据框中的列名称包含重复的名称。

在您的示例中,各种列在源文件中出现多次。我不认为concat能很好地应对这些重复的列。

import pandas as pd
s1 = [0,1,2,3,4,5]
s2 = [0,0,0,0,1,1]
A = pd.DataFrame([s2,s1],columns=['A','B','C','D','E','F'])

导致:

A B C D E F
-----------
0 0 0 0 1 1 
0 1 2 3 4 5 

获取列的子集并使用它们来创建名为B

的新数据框
B = A[['A','C','E']]
 

A C E
-----
0 0 1 
0 2 4 

创建一个新的空目标数据框

col_names = ['D','A','C','B']
Z = pd.DataFrame(columns=col_names)
D A C B
-------

并将两者结合起来:

Z = pd.concat([B,Z],axis=0)
A  C  D   E
0  0  NaN 1 
0  2  NaN 4 

工作正常!

但是,如果我使用列重新创建空数据框:

col_names = ['D','A','C','D']
Z = pd.DataFrame(columns=col_names)
    D A C D

尝试连接:

col_names = ['D','A','C','D']
Z = pd.DataFrame(columns=col_names)

然后我得到你描述的错误。

答案 1 :(得分:2)

这是因为数据中的重复列(SIL)。请参阅:Pandas concat gives error ValueError: Plan shapes are not aligned