Отбрасывание первого ряда CSV, если условие - PullRequest
0 голосов
/ 03 марта 2020

Я создаю приложение, и часть его загружает CSV-файл, который присутствует в GCP Storage.

Я использую эту функцию для получения csv, обратите внимание, что она загружается в виде строки.

def get_my_csv(run, library):
    storage_client = storage.Client()
    bucket = storage_client.get_bucket(BUCKET_NAME)
    blobs = bucket.list_blobs(prefix="{}/{}".format(run, library))
    for blob in blobs:
        return blob.download_as_string().decode("utf-8")

После получения CSV я анализирую его в pandas фрейме данных следующим образом:

csv_to_use = get_my_csv(run, library)
reader = csv.DictReader(csv_to_use.splitlines())
rows = [r for r in reader]
df = pd.DataFrame(rows)

Теперь у меня проблема в том, что люди, отвечающие за загрузку этого CSV-файла, иногда путаются, и я получаю CSV, который выглядит следующим образом:

Analysis pipeline:,Class II - DPB Full Length,,,,
Local ID,Sample ID,For Code ,For Code Seq,Rev Code Name,Rev Code Seq
4,2949,004F,GGTAGTGTGTATCAGTACATG,004R,GGTAGTGTGTATCAGTACATG
5,1596,005F,GGTAGACACGCATGACACACT,005R,GGTAGACACGCATGACACACT
13,3319,013F,GGTAGACACTGACGTCGCGAC,013R,GGTAGACACTGACGTCGCGAC

Как вы можете заметить есть строка перед фактическим заголовочным файлом. Как я могу справиться с этим? Также я никогда не уверен, что они на самом деле могут поместить в заголовки. Есть ли способ сделать мой код достаточно умным, чтобы справиться с этим?

Если не достаточно умен, то какие логики c можно использовать, чтобы отбросить эту строку: Analysis pipeline:,Class II - DPB Full Length,,,, и сделать Local ID,Sample ID,For Code ,For Code Seq,Rev Code Name,Rev Code Seq моим заголовком?

Обновление

В основном, For Code ,For Code Seq,Rev Code Name,Rev Code Seq всегда должно присутствовать в заголовке. Как я могу пропустить, пока не найду это, сделать этот заголовок и разобрать остальное?

Ответы [ 2 ]

1 голос
/ 03 марта 2020

Я бы предположил, что первое поле первой строки данных - это число c, а фактический заголовок - это просто предыдущий.

Я бы сделал:

import io
import re
...

numeric = re.compile(r'\d+$')                 # a regex to match a numeric field
csv_to_use = get_my_csv(run, library)
reader = csv.reader(io.StringIO(csv_to_use))
rows = list(reader)

# search first data row:
for i, row in enumerate(rows):
    if numeric.match(row[0]):
        break
if i == 0: i=1                    # ensure at least a header row...

# build the dataframe
df = df.DataFrame(rows[i:], columns=rows[i-1])

Если вы хотите отфильтровать пробелы в заголовках, просто замените последнюю строку на:

df = df.DataFrame(rows[i:], columns=[r.replace(' ', '') for r in rows[i-1]])
1 голос
/ 03 марта 2020

Вот базовый c подход к проверке того, что вы сказали, всегда должен быть в заголовках столбцов.

csv_to_use = get_my_csv(run, library)
i = 0
for i, row in enumerate(csv_to_use.splitlines()):
    row_split = row.split(',')
    broken = False
    for j,label in enumerate(row_split):
        if 'For Code' in label and 'For Code Seq' in row_split[j+1] and 'Rev Code Name' in row_split[j+2] and 'Rev Code Seq' in row_split[j+3]:
            broken = True
            break
    if broken:
        break
reader = csv.DictReader(csv_to_use.splitlines()[i:])
rows = [r for r in reader]
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...