Как заменить последний столбец файла CSV, где значение больше 0 - PullRequest
0 голосов
/ 11 декабря 2018

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

, например:

1,1,34
1,2,32
1,3,0
1,4,12

Мне нужно иметь возможность изменить значение впоследний столбец в 1, где значение больше 0.

пример вывода:

1,1,1
1,2,1
1,3,0
1,4,1

Может кто-нибудь помочь?до сих пор мне удалось заменить последний символ, но я не могу понять, как заменить весь столбец независимо от значения

[сложение]

я пробовал этона данный момент

lines = [line.replace("2\n","1\n") for line in lines]
lines = [line.replace("3\n","1\n") for line in lines]

и т. д.

но это, очевидно, не охватит весь спектр чисел

Ответы [ 4 ]

0 голосов
/ 11 декабря 2018

Вы можете создать новый CSV из существующего с обновленными значениями.Пример кода ниже.

import csv
with open(r'C:\Users\gupta\Desktop\csvfile.csv') as inputFile:
    x = csv.reader(inputFile)
    for lines in x:
        if int(lines[-1]) > 0:
           lines[-1] = 1
        with open(r'C:\Users\gupta\Desktop\csvfile1.csv','a') as outFile:
            iWrite = csv.writer(outFile, delimiter=' ')
            iWrite.writerow(lines)
0 голосов
/ 11 декабря 2018

Простой и без использования каких-либо внешних модулей:

with open('/path/to/data.txt', 'r') as f:
    data = [list(map(float, l.strip().split(',')))  for l in f.readlines()]
data = [x[:-1] + ([1] if x[-1] else [0]) for x in data]

Можно сделать 1-строчный:

data = [list(map(float, l.strip().split(',')))[:-1] + ([1] if list(map(int, l.strip().split(',')))[-1] else [0]) for l in open(r"C:\Users\ShlomiF\Documents\new 3.txt", 'r').readlines()]

Но это анти-python-zen: -)


Редактировать:
Запись обратно в файл просто отменяет вышеприведенное:

with open('/path/to/file/of/choice.txt', 'w') as f:  # Can be same file
    for x in data:
        f.write(','.join(list(map(str, x))) + '\n')
0 голосов
/ 11 декабря 2018

Вы можете использовать регулярное выражение:

import re


data = ["1,1,34",
        "1,2,32",
        "1,3,0",
        "1,4,12"]

pattern = r"^([0-9]+,[0-9]+),(?:[2-9]|\d\d\d*)$"

for line in data:
    if re.match(pattern, line):
        line = re.sub(pattern, r"\1,1", line)
    print(line)

Вывод:

1,1,1
1,2,1
1,3,0
1,4,1
0 голосов
/ 11 декабря 2018

Вы можете использовать панды и лямбда-функции.

import pandas as pd

data = pd.read_csv(<your csv>, headers=None)

data.iloc[:, -1] = data.iloc[:, -1].apply([lambda x: x if x <= 1 else 1])
data.to_csv(<your csv>, index=False, header=False)

Лямбда-функция проверяет, является ли значение в последнем столбце (-1 в data.iloc[:, -1]) больше 1, и заменяет его на 1, если это так.

это создает вывод:

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