Как отфильтровать строку из всех столбцов из CSV-файла с помощью python

#python-3.x

#python-3.x

Вопрос:

пример файла csv У меня есть файл csv, и мне нужно проверить все столбцы, чтобы найти? в файле csv и удалите эти строки.

ниже приведен пример

 Column1 Column 2 Column 3
1 ? 3
2 ?.. 1
? 2 ?.
? 4 4
 

Я попробовал ниже, однако это не работает

 data = readData(“text.csv”)
print(data)

def Filter(string, substr):
return [str for str in string if
any(sub not in str for sub in substr)]

string = data
substr = [’?’,’?.’,’? ‘,’? ']
filter_data=Filter(string, substr)
 

ниже приведен мой код для получения вывода в tupples.

 import numpy as np
import matplotlib.pyplot as plt
import pandas as pd

def readData(filename) :
    data = pd.read_csv(filename, skipinitialspace=True)
    return [d for d in data.itertuples(index=False, name=None)]

data = readData("problem2.csv")
print(data)

[('18.0', 8, '307.0 ', '130.0 ', '3504.', '12.0', 70, 1, 'chevrolet chevelle malibu'), ('15.0', 8, '350.0 ', '165.0 ', '3693.', '11.5', 70, 1, 'buick skylark 320'), ('18.0', 8, '318.0 ', '150.0 ', '?.', '11.0', 70, 1, 'plymouth satellite'), ('16.0', 8, '304.0 ', '150.0 ', '3433.', '12.0', 70, 1, 'amc rebel sst'), ('17.0', 8, '302.0 ', '140.0 ', '3449.', '10.5', 70, 1, 'ford torino'), ('15.0', 8, '429.0 ', '198.0 ', '4341.', '10.0', 70, 1, 'ford galaxie 500'), ('14.0', 8, '454.0 ', '220.0 ', '4354.', '9.0', 70, 1, 'chevrolet impala'), ('14.0', 8, '440.0 ', '215.0 ', '4312.', '8.5', 70, 1, 'plymouth fury iii'),
 

Далее нужно удалить строки с ‘?; из всех столбцов, чтобы обеспечить одинаковый вывод в tupples.

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

1. не могли бы вы поделиться несколькими строками файла text.csv, пожалуйста?

2. вот ссылка drive.google.com/file/d/1ZtRobqEUFDjbw2Plq5lLmpe2xfzJc7K6 /…

3. вы пробовали re.replace(‘?’,»)

4. Вы хотите удалить всю строку, если какая-либо запись содержит ? , если вы используете a *nix или mac, вы могли бы сделать grep -v '?' text.csv

Ответ №1:

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

 mpg,cylinder,displace,horsepower,weight,accelerate,year,origin,name
18,8,307,130,3504,12,70,1,chevy malibu
18,8,308,140,?.,14,70,1,plymoth satellite
18,8,309,150,?,15,70,1,ford torino
18,8,310,150,? ,16,70,1,ford galaxy
18,8,310,150, ?,17,70,1,pontiac catalina
18,8,310,150,3505,18,70,1,ford maverick
 

Код для замены любого из следующих случаев ['?','?.',' ?','? '] выглядит следующим образом:

 import csv
qs = ['?','?.',' ?','? ']
with open('abc.txt') as csv_file:
    csv_reader = csv.reader(csv_file, delimiter=',')
    for row in csv_reader:
        row = ['' if r in qs else r for r in row]
        print (row)
 

Результат этого будет следующим:

 ['mpg', 'cylinder', 'displace', 'horsepower', 'weight', 'accelerate', 'year', 'origin', 'name']
['18', '8', '307', '130', '3504', '12', '70', '1', 'chevy malibu']
['18', '8', '308', '140', '', '14', '70', '1', 'plymoth satellite']
['18', '8', '309', '150', '', '15', '70', '1', 'ford torino']
['18', '8', '310', '150', '', '16', '70', '1', 'ford galaxy']
['18', '8', '310', '150', '', '17', '70', '1', 'pontiac catalina']
['18', '8', '310', '150', '3505', '18', '70', '1', 'ford maverick']
 

Как вы можете видеть, значения из строк с 3 по 6 были заменены на '' .

Запускался с еще одним образцом набора данных:

 mpg,cylinder,displace,horsepower,weight,accelerate,year,origin,name
18,8,307,130,3504,12,70,1,chevy malibu
18,8,308,140,?.,14,70,1,plymoth satellite
18,8,309,?,3506,15,70,1,ford torino
18,8,310,160,? ,16,70,1,ford galaxy
18,8,311,170,3508, ?,70,1,pontiac catalina
18,8,312,180,3509,18,70,1,ford maverick
 

Результат — это:

 ['mpg', 'cylinder', 'displace', 'horsepower', 'weight', 'accelerate', 'year', 'origin', 'name']
['18', '8', '307', '130', '3504', '12', '70', '1', 'chevy malibu']
['18', '8', '308', '140', '', '14', '70', '1', 'plymoth satellite']
['18', '8', '309', '', '3506', '15', '70', '1', 'ford torino']
['18', '8', '310', '160', '', '16', '70', '1', 'ford galaxy']
['18', '8', '311', '170', '3508', '', '70', '1', 'pontiac catalina']
['18', '8', '312', '180', '3509', '18', '70', '1', 'ford maverick']
 

В этом сценарии значение ? находится в разных столбцах. Это все еще решает проблему.

В случае, если вы ищете все строки за один раз, вы можете прочитать все строки в одну переменную и обработать ее.

 qs = {'?.':'',' ?':'','? ':'','?':''}
with open('abc.txt') as csv_file:
    lines = csv_file.readlines()
    for i,text in enumerate(lines):
        [text := text.replace(a,b) for a,b in qs.items()]
        lines[i] = text
    print (lines)
 

Ваши выходные данные будут следующими:

 ['mpg,cylinder,displace,horsepower,weight,accelerate,year,origin,namen', '18,8,307,130,3504,12,70,1,chevy malibun', '18,8,308,140,,14,70,1,plymoth satelliten', '18,8,309,,3506,15,70,1,ford torinon', '18,8,310,160,,16,70,1,ford galaxyn', '18,8,311,170,3508,,70,1,pontiac catalinan', '18,8,312,180,3509,18,70,1,ford maverickn']
 

вывод кортежа

Похоже, вы ожидаете кортежей в качестве выходных данных.

Вот код для этого:

 import csv
qs = {'?.':'',' ?':'','? ':'','?':''}
final_list = []

with open('abc.txt') as csv_file:
    csv_reader = csv.reader(csv_file, delimiter=',')
    for row in csv_reader:
        row = ['' if r in qs else r for r in row]
        final_list.append(tuple(row))

print (final_list)
 

Результат будет следующим:

 [('mpg', 'cylinder', 'displace', 'horsepower', 'weight', 'accelerate', 'year', 'origin', 'name'), ('18', '8', '307', '130', '3504', '12', '70', '1', 'chevy malibu'), ('18', '8', '308', '140', '', '14', '70', '1', 'plymoth satellite'), ('18', '8', '309', '', '3506', '15', '70', '1', 'ford torino'), ('18', '8', '310', '160', '', '16', '70', '1', 'ford galaxy'), ('18', '8', '311', '170', '3508', '', '70', '1', 'pontiac catalina'), ('18', '8', '312', '180', '3509', '18', '70', '1', 'ford maverick')]
 

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

1. Я ищу этот вывод в кортежах [(‘18.0’, 8, ‘307.0 ‘, ‘130.0 ‘, ‘3504.’, ‘12.0’, 70, 1, ‘ шевроле шевелле малибу’), (‘15.0’, 8, ‘350.0 ‘, ‘165.0 ‘, ‘3693.’, ‘11.5’, 70, 1, ‘ бьюик скайларк 320’), (‘18.0’, 8, ‘318.0 ‘, ‘150.0 ‘, ‘?.’, ‘11.0’, 70, 1, ‘ плимутский спутник’), (‘16.0’, 8,’304.0 ‘, ‘150.0 ‘, ‘3433.’, ‘12.0’, 70, 1, ‘ amc rebel sst’),

2. не могли бы вы предоставить пример входных данных, ожидаемые выходные данные. Таким образом, я могу знать, что вы ищете. Ваш вопрос не очень понятен, и требуется некоторое время, чтобы догадаться, о чем вы думаете.

3. пожалуйста, добавьте код в раздел вопросов

4. смотрите новый ответ.

5. спасибо, как мне исключить заголовок из выходных данных