仅使用选定的列合并 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
非常丑陋,但它有效。
我尝试将三个 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
非常丑陋,但它有效。