如何遍历 .csv 文件并提取 python 中的某些值?
How to loop through .csv file and extract certain values in python?
我正在尝试遍历 CSV 文件中的第 11 列并搜索术语“abc”(作为示例)。对于它找到的每个“abc”,我希望它 return 同一行第一列的值,除非它是空的。如果它是空的,我希望它逐行上升到第一列,直到找到一个不为空的单元格和 return 该单元格的值。
我已经导入了所需的 CSV 文件。这是我尝试执行上述操作的代码。
for row in csvReader:
if row[10] == 'abc':
colAVal = row
while colAVal[0] == '' and colAVal != 0:
colAVal -= 1
print(colAVal[0])
我的问题是这段代码是否做了它应该做的事情?
对于我正在尝试做的第二部分,我希望能够操纵它 returns 的值 - 有没有一种方法可以存储这些值,以便我可以编写代码,为第一部分 returned?
中的每个 colAVal[0] 做一些事情
你所拥有的并不能完全满足你的要求。涉及
colAVal -= 1
不会为您提供迭代器中的前一行。在具有更标准 for 循环的语言中,您可以通过在当前迭代器行上向后移动直到找到所需内容来访问所需数据,但在 python 中,这不是推荐的方法。 Python 的 for 循环更像是 for each 循环,因此一旦你从一行转到下一行,如果不保存或直接通过输入数据的行数访问它,就无法访问前一个目的。强烈不建议混合使用这些类型的访问,这样会很快造成混淆。
你上面的问题还有两个问题,我会尽量一一解答。
给定如下所示的数据集:
col1,col2,col3,col4,col5,col6,col7,col8,col9,col10,col11,col12
0,0,0,0,0,0,0,0,0,0,abc,0
1,1,1,1,1,1,1,1,1,1,1,1
2,2,2,2,2,2,2,2,2,2,2,2
3,3,3,3,3,3,3,3,3,3,3,3
4,4,4,4,4,4,4,4,4,4,4,4
,5,5,5,5,5,5,5,5,5,abc,5
,6,6,6,6,6,6,6,6,6,abc,6
7,7,7,7,7,7,7,7,7,7,7,7
如果我没有正确理解你的问题,你会期望答案是 0、4 和 4。您可以完成此操作并保存数据以备后用,方法如下:
#! /usr/bin/env python
import csv
results = []
with open('example.csv') as file_handler:
for row in csv.reader(file_handler):
if row[0] != '' and row[0] != 0:
lastValidFirstColumn = row[0]
if row[10] == 'abc':
results.append(lastValidFirstColumn)
print(results)
# prints ['0', '4', '4']
如果我理解正确的话,你想要的数据现在存储在结果变量中。写入文件或对其进行其他操作并不难,我建议自己查找它们,这将是一个更好的学习体验。
您可以在 pandas 中轻松做到这一点
import pandas as pd
import numpy as np
df = pd.read_csv('my.csv', header=None)
使用组成的 csv,我们有这些值
0 1 2 3 4 5 6 7 8 9 10
0 20.0 b a b a b a b a b abc
1 NaN c d c d c d c d c def
2 10.0 d e d e d e d e d ghi
3 NaN e f e f e f e f e abc
df['has_abc'] = np.where(df[10]=='abc', df.ffill()[0], np.nan)
df.dropna(subset=['has_abc'], inplace=True)
输出
0 1 2 3 4 5 6 7 8 9 10 has_abc
0 20.0 b a b a b a b a b abc 20.0
3 NaN e f e f e f e f e abc 10.0
我正在尝试遍历 CSV 文件中的第 11 列并搜索术语“abc”(作为示例)。对于它找到的每个“abc”,我希望它 return 同一行第一列的值,除非它是空的。如果它是空的,我希望它逐行上升到第一列,直到找到一个不为空的单元格和 return 该单元格的值。
我已经导入了所需的 CSV 文件。这是我尝试执行上述操作的代码。
for row in csvReader:
if row[10] == 'abc':
colAVal = row
while colAVal[0] == '' and colAVal != 0:
colAVal -= 1
print(colAVal[0])
我的问题是这段代码是否做了它应该做的事情?
对于我正在尝试做的第二部分,我希望能够操纵它 returns 的值 - 有没有一种方法可以存储这些值,以便我可以编写代码,为第一部分 returned?
中的每个 colAVal[0] 做一些事情你所拥有的并不能完全满足你的要求。涉及
colAVal -= 1
不会为您提供迭代器中的前一行。在具有更标准 for 循环的语言中,您可以通过在当前迭代器行上向后移动直到找到所需内容来访问所需数据,但在 python 中,这不是推荐的方法。 Python 的 for 循环更像是 for each 循环,因此一旦你从一行转到下一行,如果不保存或直接通过输入数据的行数访问它,就无法访问前一个目的。强烈不建议混合使用这些类型的访问,这样会很快造成混淆。
你上面的问题还有两个问题,我会尽量一一解答。
给定如下所示的数据集:
col1,col2,col3,col4,col5,col6,col7,col8,col9,col10,col11,col12
0,0,0,0,0,0,0,0,0,0,abc,0
1,1,1,1,1,1,1,1,1,1,1,1
2,2,2,2,2,2,2,2,2,2,2,2
3,3,3,3,3,3,3,3,3,3,3,3
4,4,4,4,4,4,4,4,4,4,4,4
,5,5,5,5,5,5,5,5,5,abc,5
,6,6,6,6,6,6,6,6,6,abc,6
7,7,7,7,7,7,7,7,7,7,7,7
如果我没有正确理解你的问题,你会期望答案是 0、4 和 4。您可以完成此操作并保存数据以备后用,方法如下:
#! /usr/bin/env python
import csv
results = []
with open('example.csv') as file_handler:
for row in csv.reader(file_handler):
if row[0] != '' and row[0] != 0:
lastValidFirstColumn = row[0]
if row[10] == 'abc':
results.append(lastValidFirstColumn)
print(results)
# prints ['0', '4', '4']
如果我理解正确的话,你想要的数据现在存储在结果变量中。写入文件或对其进行其他操作并不难,我建议自己查找它们,这将是一个更好的学习体验。
您可以在 pandas 中轻松做到这一点
import pandas as pd
import numpy as np
df = pd.read_csv('my.csv', header=None)
使用组成的 csv,我们有这些值
0 1 2 3 4 5 6 7 8 9 10
0 20.0 b a b a b a b a b abc
1 NaN c d c d c d c d c def
2 10.0 d e d e d e d e d ghi
3 NaN e f e f e f e f e abc
df['has_abc'] = np.where(df[10]=='abc', df.ffill()[0], np.nan)
df.dropna(subset=['has_abc'], inplace=True)
输出
0 1 2 3 4 5 6 7 8 9 10 has_abc
0 20.0 b a b a b a b a b abc 20.0
3 NaN e f e f e f e f e abc 10.0