仅使用选定的列合并 CSV

Merging CSV's using only selected columns

我尝试将三个 CSV 文件合并在一起。三个 CSV 有一系列不同的列,尽管所有 3 个 CSV 都有一组在它们之间一致的列。

我将这些列的 headers 列作为字符串存储在 Python 列表中。这些列是我唯一要合并的列。


附带说明一下,我已尝试实施 answer in this thread using a library called brewery,但收到错误消息

'CSVDataSource' object has no attribute 'field_names'

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

我正在使用 Python 2.7,很遗憾无法访问 Pandas。

代码示例:

Columns_to_Merge = ['ColumnA','ColumnB','ColumnC']

# CSV1

ColumnA,ColumnB,ColumnF,ColumnC
2,3,4,9
8,2,5,7
1,2,3,4

# CSV2

ColumnD,ColumnA,ColumnC,ColumnB,ColumnH
2,3,4,9,12
8,2,5,7,2
1,2,3,4,5

# CSV3

ColumnH,ColumnJ,ColumnA,ColumnB,ColumnC
2,3,4,99,12
8,5,5,7,2
1,55,3,70,5

既然不能用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

非常丑陋,但它有效。