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

Пример 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)

мой код ниже, чтобы получить кортежи.

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'),

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

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

Joe Ferndz 10.12.2020 06:52

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

abhishek gaikwad 10.12.2020 07:15

вы пробовали заменить ('?', '')

Joe Ferndz 10.12.2020 07:17

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

beroe 10.12.2020 07:55
Стоит ли изучать PHP в 2023-2024 годах?
Стоит ли изучать PHP в 2023-2024 годах?
Привет всем, сегодня я хочу высказать свои соображения по поводу вопроса, который я уже много раз получал в своем сообществе: "Стоит ли изучать PHP в...
Поведение ключевого слова "this" в стрелочной функции в сравнении с нормальной функцией
Поведение ключевого слова "this" в стрелочной функции в сравнении с нормальной функцией
В JavaScript одним из самых запутанных понятий является поведение ключевого слова "this" в стрелочной и обычной функциях.
Приемы CSS-макетирования - floats и Flexbox
Приемы CSS-макетирования - floats и Flexbox
Здравствуйте, друзья-студенты! Готовы совершенствовать свои навыки веб-дизайна? Сегодня в нашем путешествии мы рассмотрим приемы CSS-верстки - в...
Тестирование функциональных ngrx-эффектов в Angular 16 с помощью Jest
В системе управления состояниями ngrx, совместимой с Angular 16, появились функциональные эффекты. Это здорово и делает код определенно легче для...
Концепция локализации и ее применение в приложениях React ⚡️
Концепция локализации и ее применение в приложениях React ⚡️
Локализация - это процесс адаптации приложения к различным языкам и культурным требованиям. Это позволяет пользователям получить опыт, соответствующий...
Пользовательский скаляр GraphQL
Пользовательский скаляр GraphQL
Листовые узлы системы типов GraphQL называются скалярами. Достигнув скалярного типа, невозможно спуститься дальше по иерархии типов. Скалярный тип...
1
4
636
1
Перейти к ответу Данный вопрос помечен как решенный

Ответы 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,name\n', '18,8,307,130,3504,12,70,1,chevy malibu\n', '18,8,308,140,,14,70,1,plymoth satellite\n', '18,8,309,,3506,15,70,1,ford torino\n', '18,8,310,160,,16,70,1,ford galaxy\n', '18,8,311,170,3508,,70,1,pontiac catalina\n', '18,8,312,180,3509,18,70,1,ford maverick\n']

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

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

Вот код, чтобы сделать это:

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')]

Я ищу этот вывод в кортежах [('18.0', 8, '307.0', '130.0', '3504.', '12.0', 70, 1, 'шевроле шевель малибу'), ('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 Reunist SST'),

abhishek gaikwad 10.12.2020 10:50

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

Joe Ferndz 10.12.2020 10:52

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

Joe Ferndz 10.12.2020 10:56

см. новый ответ.

Joe Ferndz 10.12.2020 11:03

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

abhishek gaikwad 10.12.2020 11:07
final_list = final_list[1:]
Joe Ferndz 10.12.2020 11:08

или перед запуском цикла for вы можете указать next(csv_reader, None) Это пропустит первую строку и обработает остальные.

Joe Ferndz 10.12.2020 11:12

Потрясающий!!! спасибо за всю помощь Джо. Я новичок в python, не могли бы вы порекомендовать какие-нибудь хорошие книги по python?

abhishek gaikwad 10.12.2020 11:13

Не забудьте проголосовать за ответ, если считаете, что он помог вам в проекте.

Joe Ferndz 10.12.2020 11:17

Спасибо, Джо, это очень полезно!

abhishek gaikwad 10.12.2020 11:19

в настоящее время значения с ? отмечены как ''. Могу ли я удалить список кортежей, который имеет ?

abhishek gaikwad 10.12.2020 16:17

Да, ты можешь. Код нуждается в небольшой доработке. Или вы можете добавить строку в код для поиска '' и вытащить их.

Joe Ferndz 10.12.2020 16:30

Другие вопросы по теме