как удалить все строки в файле CSV, значение которых больше другого?

У меня есть файл csv, 300 строк:

ID,HEIGHT,MEAN WEIGHT,20-Nov-2002,05-Mar-2003,09-Apr-2003,23-Jul-2003 1,1.80,80,78,78,82,82 2,1.60,58,56,60,60,56 3,1.90,100,98,102,98,102

Я хочу, чтобы файл удалял все строки, где столбец СРЕДНИЙ ВЕС> 75, и получал другой новый файл

ID,HEIGHT,MEAN WEIGHT,20-Nov-2002,05-Mar-2003,09-Apr-2003,23-Jul-2003 1,1.80,80,78,78,82,82 3,1.90,100,98,102,98,102


person Pedro Sousa    schedule 08.09.2015    source источник
comment
Panda подходит для выполнения таких задач, но это также можно сделать с помощью обычного модуля csv.   -  person The6thSense    schedule 08.09.2015
comment
Вы можете проверить решение по адресу: stackoverflow.com/questions/13651117/   -  person Maciej Lach    schedule 08.09.2015


Ответы (5)


если вы открыты для решений, отличных от Python, и имеете доступ к оболочке bash или awk

$ awk -F, '$3>75' filename 

ID,HEIGHT,MEAN WEIGHT,20-Nov-2002,05-Mar-2003,09-Apr-2003,23-Jul-2003
1,1.80,80,78,78,82,82
3,1.90,100,98,102,98,102
person karakfa    schedule 08.09.2015

как предложил @Vignesh Kalai, используйте панд

import pandas as pd

df = pd.read_csv("yourfile.csv", sep=",")

df[ df["MEAN WEIGHT"] > 75 ].to_csv("yournewfile.csv", index=False)

И это сделано.

P.S. Вы запрашиваете значения меньше 75, но вы показываете противоположное. Если это первый случай, замените «> 75» на «<= 75».

person YOBA    schedule 08.09.2015
comment
Он работает, но добавляет новый столбец, ID, HEIGHT, MEAN WEIGHT, 20 ноября 2002 г., 05 марта 2003 г., 09 апреля 2003 г., 23 июля 2003 г. 0,1,1,8,80,78,78, 82,82 2,3,1,9,100,98,102,98,102 - person Pedro Sousa; 08.09.2015
comment
@PedroSousa Конечно, используйте index = False (см. Изменить) - person YOBA; 08.09.2015

Используя простой питон:

orig = open('original.csv', 'r')
modi = open('modified.csv', 'w')

#header
modi.write(orig.readline())

# data lines
for line in old:
    if float(line.split(',')[2]) <= 75:
        modi.write(line)

orig.close()
modi.close()
person kikocorreoso    schedule 08.09.2015
comment
я пробовал, но появился только заголовок. в новом файле. - person Pedro Sousa; 08.09.2015

Вы можете использовать библиотеку Python csv следующим образом:

import csv

with open('input.csv', 'r') as f_input, open('output.csv', 'wb') as f_output:
    csv_input = csv.reader(f_input)
    csv_output = csv.writer(f_output)

    # Write the header
    csv_output.writerow(next(csv_input))

    for cols in csv_input:
        if int(cols[2]) <= 75:    # Keep weights <= 75
            csv_output.writerow(cols)

Таким образом, с данными, которые вы указали, вы получите следующий файл output.csv:

ID,HEIGHT,MEAN WEIGHT,20-Nov-2002,05-Mar-2003,09-Apr-2003,23-Jul-2003
2,1.60,58,56,60,60,56
person Martin Evans    schedule 08.09.2015

Perl-решение, которое выводит на экран, аналогично решению karakfa Awk:

perl -F, -ane 'print if $. == 1 or $F[4] > 75' filename

Массив авторазбиения @F начинается с индекса $F[0], а поля awk начинаются с $1

Этот вариант редактирует файл на месте:

perl -i -F, -ane 'print if $. == 1 or $F[4] > 75' filename

Этот вариант редактирует файл на месте и создает резервную копию filename.bak

perl -i.bak -F, -ane 'print if $. == 1 or $F[4] > 75' filename
person Chris Koknat    schedule 08.09.2015