如果行中的指定值与条件匹配,则从 CSV 返回一行
Posted
技术标签:
【中文标题】如果行中的指定值与条件匹配,则从 CSV 返回一行【英文标题】:Returning a row from a CSV, if specified value within the row matches condition 【发布时间】:2013-06-18 18:45:00 【问题描述】:Ahoy,我正在编写一个 Python 脚本来过滤一些大型 CSV 文件。
我只想保留符合我的条件的行。
我的输入是以下格式的 CSV 文件
Locus Total_Depth Average_Depth_sample Depth_for_17 chr1:6484996 1030 1030 1030 chr1:6484997 14 14 14 chr1:6484998 0 0 0
我想返回 Total_Depth 为 0 的行。
我一直在关注this answer 来读取数据。但是我被困在试图解析行并拉出符合我条件的行。
这是我目前的代码:
import csv
f = open("file path", 'rb')
reader = csv.reader(f) #reader object which iterates over a csv file(f)
headers = reader.next() #assign the first row to the headers variable
column = #list of columns
for h in headers: #for each header
column[h] = []
for row in reader: #for each row in the reader object
for h, v in zip(headers, row): #combine header names with row values (v) in a series of tuples
column[h].append(v) #append each value to the relevant column
我知道我的数据现在是字典格式,我想根据“Total_Depth”键对其进行过滤,但我不确定如何执行此操作。我的目标是使用“if”语句来选择相关行,但不确定如何使用字典结构来执行此操作。
任何建议将不胜感激。某人:)
【问题讨论】:
【参考方案1】:使用列表理解。
import csv
with open("filepath", 'rb') as f:
reader = csv.DictReader(f)
rows = [row for row in reader if row['Total_Depth'] != '0']
for row in rows:
print row
DictReader
【讨论】:
【参考方案2】:如果您存储了 zip 的完整结果,您可以在分配之前检查相应的标头:
...
for row in reader: #for each row in the reader object
r = zip(headers, row):
if r['Total_Depth'] == 0:
for h, v in r:
column[h].append(v)
【讨论】:
@s_boardman 我不确定它是否适合您的问题,但您可以看看numpy.genfromtxt。潜在的好处是该函数会产生一个 numpy.ndarray (结构化),它允许高级切片。您还可以对数据类型进行细粒度控制(如果这很重要的话)。【参考方案3】:您正在使用的列表字典使行操作变得非常困难,因为您必须弄乱 C 并行列表。 namedtuples 是一种更方便的方式来收集和操作表格数据。
其他答案满足您的确切问题。使用更友好的数据结构将有助于解决您明天遇到的问题。
【讨论】:
谢谢@msw,我会尝试深入研究namedtuples,看看是否可以用它构建一个更好的脚本版本。 :)以上是关于如果行中的指定值与条件匹配,则从 CSV 返回一行的主要内容,如果未能解决你的问题,请参考以下文章
如果行具有匹配的 ID,则将多行中的值合并为一行(单独的单元格)。如果 ID 只存在一次,则为 NULL 值
如果存在与数据中的某些条件匹配的另一行,则从pandas DataFrame中查找行
如果存在匹配值,则从另一个表中检索数据 - 否则基于第一个连接条件返回