如何连接两个csv文件并保持python中列的原始顺序?

时间:2016-08-12 20:45:16

标签: python csv pandas

实际上这个问题有很多部分。我通过查看其他堆栈溢出问题的答案解决了一些问题。但是,还有一个小问题没有解决。输出csv文件倾向于按字母顺序或以其他顺序排序,这不是我想要的。

作为一个例子,我将垂直连接两个csv文件。这两个csv如下所示。

    a.csv
    B, A, C, E
    1, 1, 1, 1

    b.csv
    B, A, D, C
    2, 2, 2, 2

我想得到的结果是

    c.csv
    B, A, D, C, E
    1, 1,  , 1, 1
    2, 2, 2, 2,   

首先,我将它们读入pandas数据框。

    a = pd.read_csv("a.csv")
    b = pd.read_csv("b.csv")

然后连接它们并通过

写入csv
    c = pd.concat([a, b], join='outer')
    c.to_csv("c.csv", index=False)

输出csv看起来像

    c.csv
    A, C, D, B, E
    1, 1,  , 1, 1
    2, 2, 2,  , 2 

有什么方法可以解决这个问题吗?我曾经想过回答Preserving column order in Python Pandas DataFrame

中的代码
    df.to_csv("dfTest.txt","\t",header=True,cols=["b","a","c"], engine='python')

但是,我的csv文件中有数百列,我无法手动记下列名的顺序。对于每组文件,列名称都不同。我试过了

    set(a.columns.values).union(list(b.columns.values))

它也不起作用,因为set会扰乱列表。

2 个答案:

答案 0 :(得分:1)

建立一个输出订单,然后您可以提供给c.to_csv(...),例如:

from collections import OrderedDict
out_order = OrderedDict.fromkeys(a.columns)
out_order.update(OrderedDict.fromkeys(b.columns))
out_order = list(out_order)
# ['B', 'A', 'C', 'E', 'D']

c.to_csv("c.csv", index=False, columns=out_order)

答案 1 :(得分:0)

你几乎拥有a.columns

col_names = a.columns.tolist() # list of column names
sorted_cols = sorted(col_names)

df.to_csv("dfTest.txt","\t",header=True,cols=sorted_cols, engine='python')

在一行中:

df.to_csv("dfTest.txt","\t",
          header=True,
          cols=sorted(a.columns.tolist()),
          engine='python')