选取特定列
有些时候,我们并不需要工作表中所有的列。我们可以用Python选取出需要保留的列。
有两种方法可以在Excel文件中选取特定的列:
1.使用列索引值;
2.使用列标题。
1.1 使用列索引值(基础Python)
这里我们以保留之前的january_2013工作表中Customer Name和Purchase Date这两列为例。代码如下:
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32
| #!/usr/bin/env python3
import sys from datetime import date from xlrd import open_workbook, xldate_as_tuple from xlwt import Workbook
input_file = sys.argv[1] output_file = sys.argv[2]
output_workbook = Workbook() output_worksheet = output_workbook.add_sheet('jan_2013_output') my_columns = [1, 4] with open_workbook(input_file) as workbook: worksheet = workbook.sheet_by_name('january_2013') data = [] for row_index in range(worksheet.nrows): row_list = [] for column_index in my_columns: cell_value = worksheet.cell_value(row_index, column_index) cell_type = worksheet.cell_type(row_index, column_index) if cell_type == 3: date_cell = xldate_as_tuple(cell_value, workbook.datemode) date_cell = date(*date_cell[0:3]).strftime('%m/%d/%Y') row_list.append(date_cell) else: row_list.append(cell_value) data.append(row_list) for list_index, output_list in enumerate(data): for element_index, element in enumerate(output_list): output_worksheet.write(list_index, element_index, element) output_workbook.save(output_file)
|
上面的代码中,列表变量my_columns包含整数1和4,分别代表了Customer Name和Purchase Date这两列的索引值。其他代码与之前练习过的代码类似,在这里不再赘述。
我们在命令行窗口中运行这个脚本,得到输出文件。

1.2 使用列索引值(pandas)
使用pandas模块根据列索引值选取特定列,我们需要设置数据框以及用到iloc函数。这里需要提到一点,iloc函数可以使我们同时选择特定的行和特定的列,所以如果我们想使用它选取特定的列,那么就需要在列索引值前面加上一个冒号和一个逗号,表示为这些特定的列保留所有的行,否则函数就会使用这些索引值去筛选行。
使用pandas模块的代码如下:
1 2 3 4 5 6 7 8 9 10 11 12 13
| #!/usr/bin/env python3
import pandas as pd import sys
input_file = sys.argv[1] output_file = sys.argv[2]
data_frame = pd.read_excel(input_file, 'january_2013', index_col=None) data_frame_column_by_index = data_frame.iloc[:, [1, 4]] writer = pd.ExcelWriter(output_file) data_frame_column_by_index.to_excel(writer, sheet_name='jan_13_output', index=False) writer.save()
|
在命令行窗口中运行这个脚本,得到输出文件。

2.1 使用列标题(基础Python)
这种方法适用于想保留的列的标题非常容易识别,或者在处理多个输入文件的过程中,各个输入文件中列的位置会发生改变但标题不变的情况。代码如下:
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 33 34 35 36 37
| #!/usr/bin/env python3
import sys from datetime import date from xlrd import open_workbook, xldate_as_tuple from xlwt import Workbook
input_file = sys.argv[1] output_file = sys.argv[2]
output_workbook = Workbook() output_worksheet = output_workbook.add_sheet('jan_2013_output') my_columns = ['Customer ID', 'Purchase Date'] with open_workbook(input_file) as workbook: worksheet = workbook.sheet_by_name('january_2013') data = [my_columns] header_list = worksheet.row_values(0) header_index_list = [] for header_index in range(len(header_list)): if header_list[header_index] in my_columns: header_index_list.append(header_index) for row_index in range(1, worksheet.nrows): row_list = [] for column_index in header_index_list: cell_value = worksheet.cell_value(row_index, column_index) cell_type = worksheet.cell_type(row_index, column_index) if cell_type == 3: date_cell = xldate_as_tuple(cell_value, workbook.datemode) date_cell = date(*date_cell[0:3]).strftime('%m/%d/%Y') row_list.append(date_cell) else: row_list.append(cell_value) data.append(row_list) for list_index, output_list in enumerate(data): for element_index, element in enumerate(output_list): output_worksheet.write(list_index, element_index, element) output_workbook.save(output_file)
|
上面的代码中,列表变量my_columns包含了要保留的两列的名称。因为这是要写入文件的列表题,所以直接将其加入到输出列表data中。其他代码与之前练习过的代码类似,在这里不再赘述。
我们在命令行窗口中运行这个脚本,得到输出文件。

2.2 使用列标题(pandas)
使用pandas模块根据列标题选取特定列,我们需要使用loc函数。和前面提到的iloc函数类似,如果我们想使用它选取特定的列,那么就需要在列索引值前面加上一个冒号和一个逗号,表示为这些特定的列保留所有的行,否则函数就会使用这些索引值去筛选行。
使用pandas模块的代码如下:
1 2 3 4 5 6 7 8 9 10 11 12 13
| #!/usr/bin/env python3
import pandas as pd import sys
input_file = sys.argv[1] output_file = sys.argv[2]
data_frame = pd.read_excel(input_file, 'january_2013', index_col=None) data_frame_column_by_name = data_frame.loc[:, ['Customer ID', 'Purchase Date']] writer = pd.ExcelWriter(output_file) data_frame_column_by_name.to_excel(writer, sheet_name='jan_13_output', index=False) writer.save()
|
在命令行窗口中运行这个脚本,得到输出文件。
