筛选特定的行
有些时候,你并不需要文件中所有的数据。例如,你可能只需要一个包含特定词或数字的行的子集,或者是与某个具体日期关联的行的子集。在这些情况下,可以用 Python 筛选出特定的行来使用。
你应该很熟悉如何在 Excel 中手动筛选行,使你既能处理因为体积太大以致 Excel 不能打开的 CSV 文件,又能处理多个 CSV 文件。因为要通过手动处理这些文件,时间花费太多了。
下面演示了在输入文件中筛选出特定行的 3 种方法:
行中的值满足某个条件
行中的值属于某个集合
行中的值匹配于某个模式(正则表达式)
接下来会详细解释这种通用结构,使你可以轻松地修改代码来满足自己的业务规则。
请注意以下结构,从而来理解如何从输入文件中筛选出特定的行:
for row in filereader:
***if value in row meets some business rule or set of rules:***
do something
else:
do something else
这段伪代码展示了用来在输入文件中筛选出特定行的通用代码结构。在下面,会修改封装在 *** 之间的代码,以使脚本能够满足具体业务规则,抽取出你需要的数据。
行中的值满足某个条件
基础Python
有些时候,当行中的值满足一个具体条件时,才需要保留这些行。例如,你可能会希望在数据集中保留那些成本高于某个具体阈值的行,或者希望保留所有购买日期在一个具体日期之前的行。在这种情况下,你可以检验行中的值是否满足具体的条件,然后筛选出满足条件的行。
下面的示例演示了检验行值是否满足两个具体条件的方法,并将满足条件的行的子集写入一个输出文件。在这个示例中,保留供应商名字为 Supplier Z 或成本大于 $600.00 的行,并将结果写入输出文件。要筛选出满足这些条件的行的子集,在文本编辑器中输入以下代码,将文件保存为 3csv_reader_value_meets_condition.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 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\