实际上这个问题有很多部分。我通过查看其他堆栈溢出问题的答案解决了一些问题。但是,还有一个小问题没有解决。输出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会扰乱列表。
答案 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')