Я очень новичок в Python, и я пытался обнаружить недостающие данные в списках, созданных из данных в импортированных файлах csv, чтобы я мог построить серию с использованием matplotlib без получения ошибки.
Я покажу вам, что у меня есть:
import numpy as np
# import matplotlib.pyplot as plt
import csv
from pylab import *
res = csv.reader(open('cvs_file_with_data.csv'), delimiter=',')
res.next() # do not read header
ColOneData = []
ColTwoData = []
ColThreeData = []
for col in res:
ColOneData.append(col[0])
ColTwoData.append(col[1])
ColThreeData.append(col[2])
print ColOneData # I got here the following ['1', '2', '3', '4', '5']
print ColTwoData # I got here the following ['1', '2', '', '', '5']
print ColThreeData # I got here the following ['', '', '3', '4', '']
ColTwoData_M = np.ma.masked_where(ColTwoData == '', ColTwoData) # This does not work
Мне нужно замаскировать пустые значения, например '', чтобы я мог построить серию без ошибок. Любое предложение решить эту проблему?
С уважением...
Что вы подразумеваете под маской? Удалить? Если да, попробуйте следующее:
masked_data = [point for point in data if point != '']
Редактировать:
Я не привык к numpy, но, возможно, это то, что вы ищете:
>>> data = numpy.array(['0', '', '1', '', '2'])
>>> numpy.ma.masked_where(data == '', data)
masked_array(data = [0 -- 1 -- 2],
mask = [False True False True False],
fill_value = N/A)
Хосе, если вы хотите построить столбец1 против столбца2 и не иметь пустых элементов, вызывающих ошибки, вам придется удалить пустые элементы в столбце2 вместе с соответствующими элементами в столбце1. Функция, подобная следующей, должна делать трюк.
def remove_empty(col1, col2):
# make copies so our modifications don't clobber the original lists
col1 = list(col1)
col2 = list(col2)
i = 0
while i < len(col1):
# if either the item in col1 or col2 is empty remove both of them
if col1[i] == '' or col2[i] == '':
del col1[i]
del col2[i]
# otherwise, increment the index
else: i+=1
return col1, col2
Если то, что вы хотите сделать, это добавить значение заливки в пустые узлы, вы можете сделать что-то вроде этого:
def defaultIfEmpty(a):
if a == '':
return '0'
return a
x = ['0', '', '2', '3', '']
map (defaultIfEmpty,x)
result: x = ['0', '0', '2', '3', '0']
Если это результат, который вы ищете, вы можете map(defaultIfEmpty,ColOneData)
затем ColTwoData и т.д.
'0'
. Это заговор правильно?