Как l oop через файл .csv и извлечь определенные значения в python? - PullRequest
0 голосов
/ 10 июля 2020

Я пробую l oop через 11-й столбец в файле CSV и ищу термин «ab c» (как пример). Для каждого найденного «ab c» я хочу, чтобы он возвращал значение первого столбца той же строки, если он не пуст. Если он пуст, я хочу, чтобы он go поднимался вверх по первому столбцу строка за строкой, пока не находил непустую ячейку и не возвращал значение этой ячейки.

Я уже импортировал необходимый файл CSV. Вот мой код пытается сделать то же самое.

for row in csvReader:
    if row[10] == 'abc':
        colAVal = row
        while colAVal[0] == '' and colAVal != 0:
            colAVal -= 1
        print(colAVal[0])

Мой вопрос: делает ли этот код то, что он должен делать?

И для второй части того, что я пытаюсь сделать , Я хочу иметь возможность манипулировать значениями, которые он возвращает - есть ли способ сохранить эти значения, чтобы я мог написать код, который что-то делает для каждого colAVal [0], возвращаемого первой частью?

Ответы [ 2 ]

0 голосов
/ 10 июля 2020

Вы можете сделать это в 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
0 голосов
/ 10 июля 2020

То, что у вас есть, не совсем то, что вы хотите. Вызов

colAVal -= 1

не дает вам предыдущую строку в итераторе. В языках с более стандартным l oop вместо этого вы можете получить доступ к нужным данным, возвращаясь назад по текущей строке итератора, пока не найдете то, что вам нужно, но в python это не рекомендуемый подход. Python для l oop больше для каждого l oop, и поэтому после перехода от одной строки к следующей предыдущая становится недоступной без сохранения или прямого доступа к ней по количеству строк на объекте входных данных. Совмещать эти виды доступа крайне не рекомендуется, это может быстро запутать.

У вас также есть два вопроса в вашем вопросе выше, и я постараюсь ответить на оба.

Учитывая набор данных, который выглядит следующим образом:

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, если я правильно понимаю ваш вопрос. Вы можете выполнить sh это и сохранить данные для последующего использования примерно так:

#! /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']

данные, которые вы хотите, если я правильно понял, теперь хранятся в переменной результатов. Записать это в файл или проделать с ним другие манипуляции не так уж сложно, и я бы рекомендовал поискать их самостоятельно, это было бы лучше для обучения.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...