返回介绍

2.3 选取特定的列

发布于 2024-01-27 22:10:03 字数 5918 浏览 0 评论 0 收藏 0

有些时候,你并不需要文件中所有的列。在本节示例中,可以使用 Python 选取出你需要的列。

有两种通用方法可以在 CSV 文件中选取特定的列。下面各小节演示了这两种方法:

· 使用列索引值

· 使用列标题

2.3.1 列索引值

01. 基础Python

在 CSV 文件中选取特定列的一种方法是使用你想保留的列的索引值。当你想保留的列的索引值非常容易识别,或者在处理多个输入文件时,各个输入文件中列的位置一致(也就是不会发生改变)的时候,这种方法非常有效。例如,如果你只需要保留数据的第一列和最后一列,那么你可以使用 row[0] 和 row[-1] 来将每行的第一个值和最后一个值写入文件。

在这个示例中,你只想保留供应商姓名和成本这两列。要使用索引值选取这两列,在文本编辑器中输入下列代码,然后将文件保存为 6csv_reader_column_by_index.py:

 1 #!/usr/bin/env python3
 2 import csv
 3 import sys
 4 input_file = sys.argv[1]
 5 output_file = sys.argv[2]
 6 my_columns = [0, 3]
 7 with open(input_file, 'r', newline='') as csv_in_file:
 8     with open(output_file, 'w', newline='') as csv_out_file:
 9          filereader = csv.reader(csv_in_file)
10          filewriter = csv.writer(csv_out_file)
11          for row_list in filereader:
12              row_list_output = [ ]
13              for index_value in my_columns:
14                  row_list_output.append(row_list[index_value])
15              filewriter.writerow(row_list_output)

第 6 行代码创建了一个列表变量 my_columns,其中包含了你想保留的两列的索引值。在这个示例中,这两个索引值对应着供应商姓名和成本列。再说一次,应该创建一个包含索引值的变量,然后在代码中引用这个变量。这样,如果索引值需要改变的话,你只需要在一个地方(就是定义 my_columns 的地方)修改即可,修改会反映到代码中所有引用 my_columns 的地方。

第 12~15 行代码是 for 循环下面缩进的部分,所以对于输入文件中的每一行都要执行这些代码。第 12 行代码创建了一个空列表变量 row_list_output。这个变量保存你在每行中要保留的值。第 13 行代码是一个 for 循环语句,在 my_cloumns 中的各个索引值之间进行迭代。第 14 行代码通过列表的 append 函数使用每行中 my_columns 索引位置的值为 row_list_output 填充元素。这 3 行代码生成了一个列表,列表中包含了每行中你要写入输出文件的值。创建列表是有用的,因为 filewriter 的 writerow 方法需要一个字符串序列或数值序列,而列表 row_list_out 正是一个字符串序列。第 15 行代码将 row_list_output 中的值写入输出文件。

脚本会对输入文件中的每一行执行这些代码。为了确切地理解这一系列操作,下面来看看第一次外部 for 循环做了些什么。在本例中,你处理的是输入文件中的第一行(也就是标题行)。第 12 行代码创建了空列表变量 row_list_output。第 13 行代码是一个 for 循环,在 my_columns 的值之间迭代。

第一次循环时,index_value 等于 0,所以第 14 行代码中的 append 函数将 row[0](就是供应商姓名字符串)加入 row_list_output。此后,代码回到第 13 行中的 for 循环,这一次 index_value 等于 3。因为 index_value 等于 3,所以第 14 行代码中的 append 函数将 row[3](也就是成本字符串)加入 row_list_output。my_columns 中没有更多的值了,所以第 13 行中的 for 循环结束,代码前进到第 15 行。第 15 行代码将 row_list_output 中的列表值写入输出文件。然后,代码回到第 11 行中的外部 for 循环,开始处理输入文件中的下一行。

要运行这个脚本,在命令行中输入以下命令,然后按回车键:

python 6csv_reader_column_by_index.py supplier_data.csv output_files\6output.csv

你可以打开输出文件 6output.csv 查看一下结果。

02. pandas

要使用 pandas 根据索引值选取列,在文本编辑器中输入下列代码,然后将文件保存为 pandas_column_by_index.py(这个脚本读取 CSV 文件,将索引值为 0 和 3 的列打印到屏幕,并将同样的行写入输出文件):

#!/usr/bin/env python3
import pandas as pd
import sys
input_file = sys.argv[1]
output_file = sys.argv[2]
data_frame = pd.read_csv(input_file)
data_frame_column_by_index = data_frame.iloc[:, [0, 3]]
data_frame_column_by_index.to_csv(output_file, index=False)

这里使用了 iloc 函数来根据索引位置选取列。

在命令行中运行以下脚本:

python pandas_column_by_index.py supplier_data.csv\
output_files\pandas_output.csv

你可以打开输出文件 pandas_output.csv 查看一下结果。

2.3.2 列标题

01. 基础Python

在 CSV 文件中选取特定列的第二种方法是使用列标题,而不是索引位置。当你想保留的列的标题非常容易识别,或者在处理多个输入文件时,各个输入文件中列的位置会发生改变,但标题不变的时候,这种方法非常有效。

举例来说,假设你只需要保留发票号码列和购买日期列。要使用列标题选取这两列,在文本编辑器中输入下列代码,然后将文件保存为 7csv_reader_column_by_name.py:

 1 #!/usr/bin/env python3
 2 import csv
 3 import sys
 4 input_file = sys.argv[1]
 5 output_file = sys.argv[2]
 6 my_columns = ['Invoice Number', 'Purchase Date']
 7 my_columns_index = []
 8 with open(input_file, 'r', newline='') as csv_in_file:
 9     with open(output_file, 'w', newline='') as csv_out_file:
10          filereader = csv.reader(csv_in_file)
11          filewriter = csv.writer(csv_out_file)
12          header = next(filereader, None)
13          for index_value in range(len(header)):
14              if header[index_value] in my_columns:
15                   my_columns_index.append(index_value)
16          filewriter.writerow(my_columns)
17          for row_list in filereader:
18              row_list_output = [ ]
19              for index_value in my_columns_index:
20              row_list_output.append(row_list[index_value])
21          filewriter.writerow(row_list_output)

这个示例中的代码比上一个示例要稍微长一点,但是所有代码看起来都很熟悉。此示例中有更多代码的唯一原因就是,你需要先单独处理一下标题行,识别出相应标题行对应的索引值。然后你可以使用索引值保留每行中的值,这些值和要保留的列标题具有同样的索引值。

第 6 行代码创建了一个列表变量 my_columns,其中包含了两个字符串,即要保留的两列的名字。第 7 行代码创建了一个空列表变量 my_columns_index,要使用两个保留列的索引值来填充它。

第 12 行代码在 filereader 对象上使用 next 函数从输入文件中读出第一行,并保存在列表变量 header 中。第 13 行代码初始化在列标题的索引值中迭代的 for 循环。

第 14 行代码使用 if 语句和列表索引来检验每个列标题是否在 my_columns 中。例如,第一次 for 循环时,index_value 等于 0,所以 if 语句检验 header[0](也就是第一个列标题供应商姓名)是否在 my_columns 中。因为供应商姓名不在 my_columns 中,所以第 15 行代码不会对这个值执行。

代码返回第 13 行中的 for 循环,这一次 index_value 等于 1。然后,第 14 行代码中的 if 语句检验 header[1](也就是第二个列标题发票号码)是否在 my_columns 中。因为发票号码在 my_columns 中,所以执行第 15 行代码,将这列的索引值加入到 my_columns_index 列表中。

然后继续 for 循环,最后将购买日期列的索引值加入 my_columns_index。一旦 for 循环结束,第 16 行代码就将 my_columns 中的两个字符串写入输出文件。

第 18~21 行代码处理输入文件中余下的数据行。第 18 行代码创建一个空列表 row_list_output 来保存你要在每一行中保留的值。第 19 行代码中的 for 循环在 my_columns_index 中的索引值之间迭代,第 20 行代码将数据行中具有这些索引值的值加入 row_list_output。最后,第 21 行代码将 row_list_output 中的值写入输出文件。

在命令行中运行以下脚本:

python 7csv_reader_column_by_name.py supplier_data.csv output_files\7output.csv

你可以打开输出文件 7output.csv 查看一下结果。

02. pandas

要使用 pandas 根据列标题选取列,在文本编辑器中输入下列代码,然后将文件保存为 pandas_column_by_name.py(这个脚本读取 CSV 文件,将发票号码列与购买日期列打印到屏幕,并将同样的列写入输出文件):

#!/usr/bin/env python3
import pandas as pd
import sys
input_file = sys.argv[1]
output_file = sys.argv[2]
data_frame = pd.read_csv(input_file)
data_frame_column_by_name = data_frame.loc[:, ['Invoice Number', 'Purchase Date']]
data_frame_column_by_name.to_csv(output_file, index=False)

这里又一次使用 loc 函数来选取列,这次使用的是列标题。

运行以下脚本:

python pandas_column_by_name.py supplier_data.csv output_files\pandas_output.csv

你可以打开输出文件 pandas_output.csv 查看一下结果。

如果你对这篇内容有疑问,欢迎到本站社区发帖提问 参与讨论,获取更多帮助,或者扫码二维码加入 Web 技术交流群。

扫码二维码加入Web技术交流群

发布评论

需要 登录 才能够评论, 你可以免费 注册 一个本站的账号。
列表为空,暂无数据
    我们使用 Cookies 和其他技术来定制您的体验包括您的登录状态等。通过阅读我们的 隐私政策 了解更多相关信息。 单击 接受 或继续使用网站,即表示您同意使用 Cookies 和您的相关数据。
    原文