仅使用选定的列合并CSV

时间:2017-03-02 09:13:29

标签: python csv export-to-csv

我有三个我尝试合并的CSV。这三个CSV具有一系列不同的列,尽管它们都有一组在它们之间保持一致的列。

我将这些列的列标题存储在Python List中作为字符串。这些列是我想要合并的唯一列。

作为旁注,我尝试使用名为answer的库在this thread中实现brewery,但我收到了错误消息

viewDidLoad

我觉得这可以使用CSV模块轻松完成,但我不确定如何搜索每个CSV以获取正确的列,然后仅合并这些列。我不确定如何处理的另一个问题是确保整个合并CSV中每列的正确定位。 IE如果columnA是第一个CSV中的第5个跨越,然后是第2个CSV中的第4个跨,我将如何确保它们在合并的CSV中处于相同的位置?

我使用的是Python 2.7,但遗憾的是无法访问Pandas。

代码示例:

'CSVDataSource' object has no attribute 'field_names'

1 个答案:

答案 0 :(得分:0)

由于不能使用pandas,我会使用如下的numpy:

# first get all the columns of each csv file as lists
csv1_cols = ['ColumnA','ColumnB','ColumnF','ColumnC']
csv2_cols = ['ColumnD','ColumnA','ColumnC','ColumnB','ColumnH']
csv3_cols = ['ColumnH','ColumnJ','ColumnA','ColumnB','ColumnC']

# then get the indices of the columns that you want to keep
idxs_colA = [csv1_cols.index('ColumnA'), csv2_cols.index('ColumnA'), csv3_cols.index('ColumnA')]
idxs_colB = [csv1_cols.index('ColumnB'), csv2_cols.index('ColumnB'), csv3_cols.index('ColumnB')]
idxs_colC = [csv1_cols.index('ColumnC'), csv2_cols.index('ColumnC'), csv3_cols.index('ColumnC')]

# get the columns as vectors and flatten them
colA = np.array([csv1[:,idxs_colA[0]], csv2[:,idxs_colA[1]], csv3[:,idxs_colA[2]]]).flatten()
colB = np.array([csv1[:,idxs_colB[0]], csv2[:,idxs_colB[1]], csv3[:,idxs_colB[2]]]).flatten()
colC = np.array([csv1[:,idxs_colC[0]], csv2[:,idxs_colC[1]], csv3[:,idxs_colC[2]]]).flatten()

# finally, create a new np array (with the cols in the order you want)
# and transpose it
new_csv = np.array([colA, colB, colC]).T

相当难看,但它确实有效。