如何合并两个不同大小的数据帧并保留其列顺序?

时间:2017-07-27 20:30:53

标签: python pandas dataframe

考虑数据帧

A:

g    N    a
1    3    5
2    4    6

和B:

g    N    a   e
3    3    4   7
4    9    1   8

是否有某种方法可以合并这些,以便得到的数据帧是:

g    N    a   e
1    3    5   NaN
2    4    6   NaN
3    3    4   7
4    9    1   8

换句话说,是否有某种方法可以保留列顺序而不是按字典顺序重新排序?

3 个答案:

答案 0 :(得分:5)

使用reindex_axis

pd.concat([A,B]).reindex_axis(B.columns, axis=1)

输出:

   g  N  a    e
0  1  3  5  NaN
1  2  4  6  NaN
0  3  3  4  7.0
1  4  9  1  8.0

答案 1 :(得分:2)

合并时,请指定sort=False

In [1251]: A.merge(B, how='outer', sort=False)
Out[1251]: 
   g  N  a    e
0  1  3  5  NaN
1  2  4  6  NaN
2  3  3  4  7.0
3  4  9  1  8.0

答案 2 :(得分:1)

以下应该可以解决问题:pd.concat([a, b])[b.columns]

完整的测试代码:

import pandas as pd
from io import StringIO

a = pd.read_csv(StringIO("""
g    N    a
1    3    5
2    4    6
"""), sep=r"\s*")

b = pd.read_csv(StringIO("""
g    N    a   e
3    3    4   7
4    9    1   8
"""), sep=r"\s*")

pd.concat([a, b])[b.columns]

这会产生:

   g  N  a    e
0  1  3  5  NaN
1  2  4  6  NaN
0  3  3  4  7.0
1  4  9  1  8.0

您可能还想重置索引:

pd.concat([a, b])[b.columns].reset_index(drop=True)

...以删除索引重复项。这给出了:

   g  N  a    e
0  1  3  5  NaN
1  2  4  6  NaN
2  3  3  4  7.0
3  4  9  1  8.0