筛选特定的行

有些时候,你并不需要文件中所有的数据。例如,你可能只需要一个包含特定词或数字的行的子集,或者是与某个具体日期关联的行的子集。在这些情况下,可以用 Python 筛选出特定的行来使用。

你应该很熟悉如何在 Excel 中手动筛选行,使你既能处理因为体积太大以致 Excel 不能打开的 CSV 文件,又能处理多个 CSV 文件。因为要通过手动处理这些文件,时间花费太多了。

下面演示了在输入文件中筛选出特定行的 3 种方法:

  • 行中的值满足某个条件
  • 行中的值属于某个集合
  • 行中的值匹配于某个模式(正则表达式)

接下来会详细解释这种通用结构,使你可以轻松地修改代码来满足自己的业务规则。

请注意以下结构,从而来理解如何从输入文件中筛选出特定的行:

for row in filereader:***if value in row meets some business rule or set of rules:***do somethingelse:do something else

这段伪代码展示了用来在输入文件中筛选出特定行的通用代码结构。在下面,会修改封装在 *** 之间的代码,以使脚本能够满足具体业务规则,抽取出你需要的数据。

行中的值满足某个条件

基础Python

有些时候,当行中的值满足一个具体条件时,才需要保留这些行。例如,你可能会希望在数据集中保留那些成本高于某个具体阈值的行,或者希望保留所有购买日期在一个具体日期之前的行。在这种情况下,你可以检验行中的值是否满足具体的条件,然后筛选出满足条件的行。

下面的示例演示了检验行值是否满足两个具体条件的方法,并将满足条件的行的子集写入一个输出文件。在这个示例中,保留供应商名字为 Supplier Z 或成本大于 $600.00 的行,并将结果写入输出文件。要筛选出满足这些条件的行的子集,在文本编辑器中输入以下代码,将文件保存为 3csv_reader_value_meets_condition.py:

 1 #!/usr/bin/env python32 import csv3 import sys4 input_file = sys.argv[1]5 output_file = sys.argv[2]6 with open(input_file, 'r', newline='') as csv_in_file:7     with open(output_file, 'w', newline='') as csv_out_file:8          filereader = csv.reader(csv_in_file)9          filewriter = csv.writer(csv_out_file)
10          header = next(filereader)
11          filewriter.writerow(header)
12          for row_list in filereader:
13               supplier = str(row_list[0]).strip()
14               cost = str(row_list[3]).strip('$').replace(',', '')
15               if supplier == 'Supplier Z' or float(cost) > 600.0:
16                    filewriter.writerow(row_list)

第 10 行代码使用 csv 模块的 next 函数读出输入文件的第一行,赋给名为 header 的列表变量。第 11 行代码将标题行写入输出文件。

第 13 行代码取出每行数据中的供应商名字,并赋给名为 supplier 的变量。这行代码使用列表索引取出每行数据的第一个值 row[0],然后使用 str 函数将其转换为一个字符串。在此之后,使用 strip 函数删除字符串两端的空格、制表符和换行符。最后,将处理好的字符串赋给变量 supplier。

第 14 行代码取出每行数据中的成本,并赋给名为 cost 的变量。这行代码使用列表索引取出每行数据的第四个值 row[3],然后使用 str 函数将其转换为一个字符串。在此之后,使用 strip 函数从字符串中删除美元符号。接着使用 replace 函数从字符串中删除逗号。最后,将处理好的字符串赋给变量 cost。

第 15 行代码创建了一个 if 语句,来检验每行中的这两个值是否满足条件。具体来说,这里想筛选出供应商名字为 Supplier Z 或者成本大于 $600.00 的那些行。if 和 or 之间的第一个条件检验变量 supplier 中的值是否为 Supplier Z。or 和冒号之间的第二个条件检验变量 cost 中的值在被转换为浮点数之后,是否大于 600.0。

第 16 行代码使用 filewriter 的 writerow 函数将满足条件的行写入输出文件。

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

python 3csv_reader_value_meets_condition.py supplier_data.csv\
output_files\3output.csv

在屏幕上你不会看到任何输出,但可以打开输出文件 3output.csv 看一下结果。检查一下,确保结果正确,然后可以修改一下代码,设定不同的供应商或成本阈值,试着筛选一下其他数据。

pandas

pandas 提供了一个 loc 函数,可以同时选择特定的行与列。你需要在逗号前面设定行筛选条件,在逗号后面设定列筛选条件。下面的 loc 函数中的条件设置为:Supplier Name 列中姓名包含 Z,或者 Cost 列中的值大于 600.0,并且需要所有的列。在文本编辑器中输入以下代码,将文件保存为 pandas_value_meets_condition.py(这个脚本使用 pandas 来分析 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['Cost'] = data_frame['Cost'].str.strip('$').astype(float)
data_frame_value_meets_condition = data_frame.loc[(data_frame['Supplier Name']\
.str.contains('Z')) | (data_frame['Cost'] > 600.0), :]
data_frame_value_meets_condition.to_csv(output_file, index=False)

在命令行中运行脚本,并给出数据源文件和输出文件。

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

在屏幕上你不会看到任何输出,但可以打开输出文件 pandas_output.csv 看一下结果。试试修改一下 loc 函数中的参数,选择出另外一些数据。

行中的值属于某个集合

基础Python

有些时候,当行中的值属于某个集合时,才需要保留这些行。例如,你可能会希望在数据集中保留那些供应商名字属于集合 {Supplier X, Supplier Y} 的行(这里的花括号表示集合,不是 Python 中的字典),或者希望保留所有购买日期属于集合 {‘1/20/14’, ‘1/30/14’} 的行。在这种情况下,你可以检验行中的值是否属于某个集合,然后筛选出具有属于该集合的值的行。

下面的示例演示了检验行值是否是集合成员的方法,并将具有集合中的值的行写入到输出文件。在这个示例中,是要保留那些购买日期属于集合 {‘1/20/14’, ‘1/30/14’} 的行,并将结果写入输出文件。要筛选出值属于这个集合的行的子集,在文本编辑器中输入以下代码,并将文件保存为 4csv_reader_value_in_set.py:

 1 #!/usr/bin/env python32 import csv3 import sys4 input_file = sys.argv[1]5 output_file = sys.argv[2]6 important_dates = ['1/20/14', '1/30/14']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          header = next(filereader)
12          filewriter.writerow(header)
13          for row_list in filereader:
14               a_date = row_list[4]
15               if a_date in important_dates:
16                    filewriter.writerow(row_list)

第 6 行代码创建了一个名为 important_dates 的列表变量,其中包含两个特定日期,这个变量就是你的集合。创建包含特定值的变量,然后在代码中引用变量,这种编写代码的方式非常有用。使用了这种方式,如果变量值发生了变化,你只需在一个地方修改代码(就是定义变量的地方),变量值的变化就会反映到代码中所有引用该变量的地方。

第 14 行代码取出每一行的购买日期,并将其赋给变量 a_date。从行列表的索引值 row[4] 可知,购买日期在第 5 列。

第 15 行代码创建了一个 if 语句来检验 a_date 变量中的购买日期是否属于 important_dates 这个集合。如果变量值在集合中,下一行代码就将这一行写入输出文件。

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

python 4csv_reader_value_in_set.py supplier_data.csv output_files/4output.csv

你可以打开输出文件 4output.csv 来检查结果。

pandas

当行中的值属于某个集合时,如何使用 pandas 筛选出这些行呢?在文本编辑器中输入以下代码,然后将文件保存为 pandas_value_in_set.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)
important_dates = ['1/20/14', '1/30/14']
data_frame_value_in_set = data_frame.loc[data_frame['Purchase Date'].\
isin(important_dates), :]
data_frame_value_in_set.to_csv(output_file, index=False)

这里最重要的新命令就是简洁的 isin。

和以前一样,在命令行中运行脚本,并给出源数据文件名和输出文件名:

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

你可以打开输出文件 pandas_output.csv 来检查结果。

行中的值匹配于某个模式/正则表达式

基础Python

有些时候,当行中的值匹配了或包含了一个特定模式(也就是正则表达式)时,才需要保留这些行。例如,你可能会希望在数据集中保留所有发票编号开始于“001-”的行,或者希望保留所有供应商名字中包含“Y”的行。在这种情况下,你可以检验行中的值是否匹配或包含某种模式,然后筛选出匹配了或包含了该模式的行。

下面的示例演示了如何检验某个值是否匹配特定的模式,并将具有这种值的行写入输出文件。在这个示例中,保留发票编号由“001-”开头的行,并将结果写入一个输出文件。要筛选出某个值匹配了这个模式的行,在文本编辑器中输入下列代码,然后将文件保存为 5csv_reader_value_matches_pattern.py:

 1 #!/usr/bin/env python32 import csv3 import re4 import sys5 input_file = sys.argv[1]6 output_file = sys.argv[2]7 pattern = re.compile(r'(?P<my_pattern_group>^001-.*)', re.I)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)
13          filewriter.writerow(header)
14          for row_list in filereader:
15               invoice_number = row_list[1]
16               if pattern.search(invoice_number):
17                    filewriter.writerow(row_list)

第 3 行代码导入正则表达式(re)模块,这样就可以使用 re 模块中的函数了。

第 7 行代码使用 re 模块的 compile 函数创建一个名为 pattern 的正则表达式变量。r 表示将单引号之间的模式当作原始字符串来处理。

元字符 ?P<my_pattern_group> 捕获了名为 <my_pattern_group> 的组中匹配了的子字符串,以便在需要时将它们打印到屏幕或写入文件。

这里要搜索的实际模式是001-.*。插入符号()是一个特殊符号,表示只在字符串开头搜索模式。所以,字符串需要以“001-”开头。句点 . 可以匹配任何字符,除了换行符。所以除换行符之外的任何字符都可以跟在“001-”后面。最后,* 表示重复前面的字符 0 次或更多次。.* 组合在一起用来表示除换行符之外的任意字符可以在“001-”后面出现任意次。更通俗的说法是:字符串在“-”后面可以包含任意值,只要字符串开始于“001-”,就会匹配正则表达式。

最后,参数 re.I 告诉正则表达式进行大小写敏感的匹配。此参数在这个示例中不是太重要,因为模式是数值型的,但是它说明了在模式中包含字符并且需要进行大小写敏感的匹配时,应该如何设置参数。

第 15 行代码使用列表索引从行中取出发票编号,并赋给变量 invoice_number。在下一行中,将在这个变量中寻找模式。

第 16 行代码使用 re 模块的 search 函数在 invoice_number 的值中寻找模式。如果模式出现在 invoice_number 值中,第 17 行代码就将这行写入输出文件。

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

python 5csv_reader_value_matches_pattern.py supplier_data.csv\
output_files\5output.csv

你可以打开输出文件 5output.csv 来查看结果。

pandas

要使用 pandas 筛选出匹配于某个模式的行,在文本编辑器中输入下列代码,然后将文件保存为 pandas_value_matches_pattern.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_value_matches_pattern = data_frame.loc[data_frame['Invoice Number'].\
str.startswith("001-"), :]
data_frame_value_matches_pattern.to_csv(output_file, index=False)

使用 pandas 时,可以使用 startwith 函数来搜索数据,不用再使用笨重冗长的正则表达式了。要运行这个脚本,在命令行中输入以下命令,然后按回车键:

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

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

选取特定的列

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

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

  • 使用列索引值
  • 使用列标题

列索引值

基础Python

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

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

 1 #!/usr/bin/env python32 import csv3 import sys4 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 查看一下结果。

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 查看一下结果。

列标题

基础Python

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

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

 1 #!/usr/bin/env python32 import csv3 import sys4 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 查看一下结果。

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 查看一下结果。

选取连续的行

有些时候,在文件内容中,工作表头部和尾部都是你不想处理的。例如,文件头部可能是标题和作者信息,文件尾部也可能会列出来源、假设、附加说明和注意事项。在很多情况下,你不需要处理这些内容。

为了演示如何在 CSV 文件中选取连续的行,需要对输入文件做如下修改。

(1) 在电子表格软件中打开 supplier_data.csv。

(2) 在文件头部插入 3 行,就在列标题那行的上面。

在 A1:A3 单元格中随便写一些文字,比如“I don’t care about this line”。

(3) 在文件尾部,也就是最后一行数据下面插入 3 行。

在最后一行数据下面 A 列的 3 个单元格中随便写一些文字,比如“I don’t want this line either”。

(4) 将文件保存为 supplier_data_unnecessary_header_footer.csv。这个文件应该如图 2-10 所示。

图 2-10:在你需要的行上方和下方具有无关数据的 CSV 文件

现在输入文件中包含了你不需要的头部和尾部信息,修改一下 Python 脚本,使它不读取这些行。

基础Python

要使用基础 Python 选取特定行,这里使用 row_counter 变量来跟踪行编号,以便可以识别和选取想保留的行。从前面的示例中,你已经知道了要保留 13 行数据。在下面的 if 代码块中,你可以看到你要写入输出文件中的行就是行索引大于等于 3 并小于等于 15 的行。

要使用基础 Python 选取这些行,在文本编辑器中输入下列代码,然后将文件保存为 11csv_reader_select_contiguous_rows.py:

 1 #!/usr/bin/env python32 import csv3 import sys4 input_file = sys.argv[1]5 output_file = sys.argv[2]6 row_counter = 07 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 in filereader:
12              if row_counter >= 3 and row_counter <= 15:
13                   filewriter.writerow([value.strip() for value in row])
14              row_counter += 1

这里使用 row_counter 变量和一个 if 语句来保留需要的行,跳过那些不需要的头部和尾部内容。对于输入文件的前 3 行,因为 row_counter 小于 3,所以不执行 if 代码块,并将 row_counter 的值增加 1。

对于输入文件的最后 3 行,row_counter 大于 15,所以也不执行 if 代码块,并将 row_counter 的值增加 1。

你要保留的行在无用的头部和尾部之间。对于这些行,row_counter 在 3 和 15 之间。if 代码块处理这些行并将它们写入输出文件。在列表生成式中使用 string 模块的 strip 函数除去每行两端的空格、制表符和换行符。

如果想看看 row_counter 变量的值和每行的内容,可以在现有的 writerow 语句上面加上一个 print 语句,比如 print(row_counter, [value.strip() for value in row])。

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

python 11csv_reader_select_contiguous_rows.py supplier_data_unnecessary_header_\
footer.csv output_files\11output.csv

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

pandas

pandas 提供了 drop 函数根据行索引或列标题来丢弃行或列。在下面的脚本中,drop 函数从输入文件中丢弃前 3 行和最后 3 行(也就是行索引为 0,1,2 和 16,17,18 的那些行)。pandas 还提供了功能强大的 iloc 函数,你可以使用这个函数根据行索引选取一个单独行作为列索引。最后,使用 reindex 函数为数据框重新生成索引。

使用 pandas 可以保留列标题行和数据行,除去不需要的头部和尾部。在文本编辑器中输入下列代码,并将文件保存为 pandas_select_contiguous_rows.py:

#!/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, header=None)
data_frame = data_frame.drop([0,1,2,16,17,18])
data_frame.columns = data_frame.iloc[0]
data_frame = data_frame.reindex(data_frame.index.drop(3))
data_frame.to_csv(output_file, index=False)

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

python pandas_select_contiguous_rows.py supplier_data_unnecessary_header_\
footer.csv output_files\pandas_output.csv

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

Python处理CSV文件(二)相关推荐

  1. python创建csv文件并写入-Python 读写 CSV

    Python 读写 CSV 文件最简单的方法是使用自带的 csv 库,复杂点的可以使用 pandas.今天老唐简单记录一下使用自带的 csv 库怎么进行 Python 的文件读写操作,主要包括新建文件 ...

  2. python csv读取数据 去掉标题-Python读csv文件去掉一列后再写入新的文件实例

    用了两种方式解决该问题,都是网上现有的解决方案. 场景说明: 有一个数据文件,以文本方式保存,现在有三列user_id,plan_id,mobile_id.目标是得到新文件只有mobile_id,pl ...

  3. python读csv最快方法_使用Python读写csv文件的三种方法

    Python读写csv文件 觉得有用的话,欢迎一起讨论相互学习~Follow Me 前言 逗号分隔值(Comma-Separated Values,CSV,有时也称为字符分隔值,因为分隔字符也可以不是 ...

  4. python读写csv文件方法总结_使用python读写CSV文件的三种方法

    Python读写csv文件 觉得有用的话,欢迎一起讨论相互学习~Follow Me 前言 逗号分隔值(Comma-Separated Values,CSV,有时也称为字符分隔值,因为分隔字符也可以不是 ...

  5. python写入csv文件的几种方法

    python写入csv文件的几种方法 最常用的一种方法,利用pandas包 import pandas as pd #任意的多组列表 a = [1,2,3] b = [4,5,6] #字典中的key值 ...

  6. python写入csv文件中文乱码解决方案

    python写入csv文件中文乱码解决方案 参考文章: (1)python写入csv文件中文乱码解决方案 (2)https://www.cnblogs.com/vsivn/p/6115537.html ...

  7. python导入csv文件-Python从CSV文件导入数据和生成简单图表

    原标题:Python从CSV文件导入数据和生成简单图表 我们已经完成Python的基础环境搭建工作,现在我们尝试导入CSV数据 我们准备一个csv测试数据,文件名是csv-test-data.csv数 ...

  8. python导入csv文件-Python读写文件(csv、txt、excel)

    大家做在数据处理的时候,肯定难免会与文件交互,那么对于指定的文件类型,我们如何操作呢? 1.python读写csv文件 import csv #python2可以用file替代open with op ...

  9. python读取csv文件的方法-python读写csv文件的方法

    1.爬取豆瓣top250书籍 import requests import json import csv from bs4 import BeautifulSoup books = [] def b ...

最新文章

  1. 英伟达宣布全面支持ARM高性能计算,三周打造全球排名第22超算
  2. Android编译笔记三
  3. Springboot注册Filter
  4. spring 源码分析(1)-xml文件解析
  5. vtigerCrm 目录结构(整理中)
  6. go 写文件_GO 文档笔记
  7. html的音频播放,HTML5 音频播放 audio
  8. Redis-数据结构01-压缩列表(ziplist)
  9. JavaScript:利用StringBuffer类提升+=拼接字符串效率
  10. exchange 2010 无人值守安装
  11. 人都喜欢抬杠:一时不抬杠就浑身难受综合症候群
  12. Android studio做中国象棋,等级1(简单单人操作)
  13. 关于unity商店里的隐藏组件
  14. WordPress强大多功能主题模板The7 v9.16.0 已激活版本完全兼容大多数插件
  15. 通过Python绘制分段函数
  16. 阿里云DevOps助理工程师认证题库和笔记(ACA)2021最新
  17. Qt下使用QAxObject进行Word转换为PDF出现错误 error: undefined reference to `QAxObject::QAxObject(QObject*)‘
  18. 递归算法从入门到完全掌握
  19. Android微信登陆
  20. 三分钟入门大数据之用户画像标签的分类

热门文章

  1. AD元件库构建及维护之——DbLib公共元件库的使用教程
  2. SVM简单非线性分类,画出分类面与支持向量(MATLAB)
  3. 10篇校招/社招面经请你查收~
  4. JAVA计算机毕业设计晨光文具店进销存系统设计与开发计算机(附源码、数据库)
  5. 工厂制造业ai人工智能应用_人工智能与金融服务业转型的未来
  6. 虚拟产品哪个平台引流比较好?虚拟产品有哪些平台可以引流
  7. Base64编解码工具
  8. Android Jni 调用
  9. 服务器上挂网站怎么挂,网站怎样上挂到云服务器
  10. window删除多余的操作系统