Пример 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'),
Далее нужно удалить строки с '?; из всех столбцов, чтобы обеспечить одинаковый вывод в кортежах.
вот ссылка drive.google.com/file/d/1ZtRobqEUFDjbw2Plq5lLmpe2xfzJc7K6/…
вы пробовали заменить ('?', '')
Вы хотите удалить всю строку, если какая-либо запись содержит ?
Если вы используете *nix
или Mac, вы можете сделать grep -v '?' text.csv
Мой входной файл выглядит следующим образом:
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'),
не могли бы вы предоставить образцы входных данных, ожидаемые выходные данные. Так я смогу узнать, что вы ищете. Ваш вопрос не очень ясен, и требуется некоторое время, чтобы угадать, о чем вы думаете.
пожалуйста, добавьте код в раздел вопросов
см. новый ответ.
спасибо, как мне исключить заголовок из вывода
final_list = final_list[1:]
или перед запуском цикла for вы можете указать next(csv_reader, None)
Это пропустит первую строку и обработает остальные.
Потрясающий!!! спасибо за всю помощь Джо. Я новичок в python, не могли бы вы порекомендовать какие-нибудь хорошие книги по python?
Не забудьте проголосовать за ответ, если считаете, что он помог вам в проекте.
Спасибо, Джо, это очень полезно!
в настоящее время значения с ? отмечены как ''. Могу ли я удалить список кортежей, который имеет ?
Да, ты можешь. Код нуждается в небольшой доработке. Или вы можете добавить строку в код для поиска ''
и вытащить их.
не могли бы вы поделиться несколькими строками файла text.csv, пожалуйста?