Цикл по нескольким значениям, хранящимся в одном столбце, например [345 1234]

#python #string #replace #split

Вопрос:

У меня есть CSV-файл, в котором в одном столбце хранятся два значения в одной позиции, например [345 1234], но иногда нет такого значения, как [] или только одно [456]. Я пишу сценарий, который хорошо работает для пустых или одиночных значений, но он не удался для двойных значений. Я попытался разделить, заменить пробел , но это дало ошибку из-за пустого или единственного значения. Как я могу включить эти два значения в цикл, который может работать как для пустого, так и для одного значения?

формат файла df выглядит следующим образом:

20200423.GS022.mseed_597000,[ ],

20200423.GS022.mseed_600000,[ ],

20200423.GS022.mseed_603000,[424 1901],

20200423.GS022.mseed_606000,[2259],

 #code for an empty or single value

with open('myfile.txt','w') as f:
for i in range(len(df)):
    itp = df.iloc[i, 1].replace('[', '').replace(']', '')
    if itp != '':
        P=int(float(itp))/100
    else:
        P=0
    
 

Я получил эту ошибку,

Ошибка значения: не удалось преобразовать строку в значение с плавающей точкой: ‘424 1901’

Ответ №1:

Причина сбоя в том, что вы конвертируете itp float в 424 1901 строку с пробелом и, следовательно, не можете быть преобразованы float .
Если 424 и 1901 имеют 2 разных значения, вы можете использовать приведенный ниже код:

 with open('myfile.txt','w') as f:
    for i in range(len(df)):
        itp = df.iloc[i, 1].replace('[', '').replace(']', '')
        for val in itp.split():
            if val != '':
                P=int(float(val))/100
            else:
                P=0
            print (f'P: {P}')
 

Однако, если оба являются одним значением, например 4241901 , вы можете использовать приведенный ниже код:

 with open('myfile.txt','w') as f:
    for i in range(len(df)):
        itp = df.iloc[i, 1].replace('[', '').replace(']', '').replace(" ","")
        if itp != '':
            P=int(float(itp))/100
        else:
            P=0
 

Комментарии:

1. Да, это разные значения, но мне нужны три условия, P может быть равно нулю, только если оно пустое, иначе каждое число в itp будет разделено на 100.

2. Так вот что делает код. Если значение val пустое, то P равно 0. Первый фрагмент кода предназначен для вас, так как это разные значения.

3. О да, это работает, но он не выводит значение P, если оно равно нулю.

4. Круто.печать никогда не была частью кода. В любом случае, в отредактированном коде также добавлена инструкция печати.

5. да, похоже, что после использования split он не будет использовать пустое значение в цикле.