Как построить несколько графиков в одном, используя 3 разных файла и другой файл для их сортировки? - PullRequest
0 голосов
/ 24 июня 2019

У меня есть 2 файла CSV. У одного из них есть отсортированные данные, а у другого нет. Пример данных как показано ниже.

Я пытаюсь взять несортированные данные и отсортировать их в соответствии с порядковыми номерами отсортированных данных. Пример: в отсортированных данных у меня индекс «1» соответствует «name001.a.a». Итак, так как он имеет номер индекса = "1", в несортированном файле я хочу, чтобы "имя 001.a.a, 0001" было первым в списке. Число после запятой в несортированном файле - это четырехзначное число, которое не играет роли в сортировке, но прикреплено к именам.

Еще один пример: индекс "2" предназначен для "name002.a.a", поэтому после сортировки новый файл будет иметь имя "name002.a.a, 0002" в качестве второго элемента в списке

unsorted.csv:

name002.a.a,0002
name001.a.a,0001
name005.a.a,0025

hostnum.csv (отсортировано):

"1    name001.a.a"
"2    name002.a.a"
"3    name005.a.a"

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

РЕДАКТ. КОД: После изменения имени csv_list на csv_file я получаю следующую ошибку

from matplotlib import pyplot as plt
import numpy as np
import csv

csv_file = []
with open('hostnum.csv', 'r') as f:
    csvreader = csv.reader(f)
    for line in csvreader:
        csv_file.append(line)

us_csv_file = []
with open('unsorted.csv', 'r') as f:
    csvreader = csv.reader(f)
    for line in csvreader:
        us_csv_file.append(line)
us_csv_file.sort(key=lambda x: csv_file.index(x[1]))

plt.plot([int(item[1]) for item in us_csv_file], 'o-')
plt.xticks(np.arange(len(csvfile)), [item[0] for item in csvfile])

plt.show()

ОШИБКА:

Traceback (most recent call last):
  File "C:/..../TEST_ALL.py", line 16, in <module>
    us_csv_file.sort(key=lambda x: csv_file.index(x[1]))
  File "C:/..../TEST_ALL.py", line 16, in <lambda>
    us_csv_file.sort(key=lambda x: csv_file.index(x[1]))
ValueError: '0002' is not in list

1 Ответ

0 голосов
/ 24 июня 2019

Ну, вы не определили csv_list в своем коде. Быстро просматривая ваш код, я думаю, что изменение us_csv_file.sort(key=lambda x: csv_list.index(x[1])) на us_csv_file.sort(key=lambda x: csv_file.index(x[1])) (т. Е. С использованием правильного имени переменной, которое равно csv_file, а не csv_list), может просто решить проблему.


Вот новая попытка. Этот пытается извлечь числа из второго столбца из hostnum.csv и помещает их в отдельный список, который затем использует для сортировки элементов. Когда я запускаю этот код, я получаю ValueError: '025' is not in list, но я предполагаю, что это потому, что вы не дали нам все файлы, и в действительности нет такой строки, которая бы содержала name025.a.a в фрагменте hostnum.csv, который вы нам дали, я также добавили [1:] в оператор сортировки.

Если это не сработает, попробуйте удалить [1:] и изменить csv_file_numbers.append(csv_file[-1][1][4:].split('.')[0]) на csv_file_numbers.append(csv_file[-1][1][4:].split('.')[0].zfill(4)). string.zfill(4) добавит нули в начало строки так долго, что ее длина будет не менее 4.

Поскольку ваш отсортированный файл содержит на один ноль больше, чем несортированный файл, я также изменил

from matplotlib import pyplot as plt
import numpy as np
import csv

csv_file = []
csv_file_numbers = []

##with open('hostnum.csv', 'r') as f:
##    csvreader = csv.reader(f, dialect="excel-tab")
##    for line in csvreader:
##        csv_file.append(line)
##        csv_file_numbers.append(line[-1][4:].split('.')[0])

with open('hostnum.csv', 'r') as f:
    sorted_raw = f.read()

for line in sorted_raw.splitlines():
    csv_file.append(line.split('\t'))
    csv_file_numbers.append(csv_file[-1][1][4:].split('.')[0])

us_csv_file = []
with open('unsorted.csv', 'r') as f:
    csvreader = csv.reader(f)
    for line in csvreader:
        us_csv_file.append(line)
us_csv_file.sort(key=lambda x: csv_file_numbers.index(x[1][1:]))

plt.plot([int(item[1]) for item in us_csv_file], 'o-')
plt.xticks(np.arange(len(csvfile)), [item[0] for item in csvfile])

plt.show()

Этот работал на моем компьютере:

from matplotlib import pyplot as plt
import numpy as np
import csv

csv_file = []
csv_file_dict = {}

##with open('hostnum.csv', 'r') as f:
##    csvreader = csv.reader(f, dialect="excel-tab")
##    for line in csvreader:
##        csv_file.append(line)
##        csv_file_numbers.append(line[-1][4:].split('.')[0])

with open('hostnum.csv', 'r') as f:
    sorted_raw = f.read()

for line in sorted_raw.splitlines():
    csv_file.append(line.split('\t'))
    csv_file_dict[csv_file[-1][-1][:-1]] = int(csv_file[-1][0][1:])

us_csv_file = []
with open('unsorted.csv', 'r') as f:
    csvreader = csv.reader(f)
    for line in csvreader:
        us_csv_file.append(line)
us_csv_file.sort(key=lambda x: csv_file_dict[x[0]])

plt.plot([int(item[1]) for item in us_csv_file], 'o-')
plt.xticks(np.arange(len(csv_file)), [item[0] for item in csv_file])

plt.show()

Итак, теперь я создал dict, в котором значения индекса хранятся в виде значений, а имена каждой ячейки, которые находятся в обоих файлах, в качестве ключей. Я также удалил цитаты вручную, так как по какой-то причине csv.reader, похоже, делал это неправильно, по крайней мере, он не обрабатывал вкладки нужным образом. Как я написал в одном из моих комментариев, я не знаю почему, наверняка, я предполагаю, что это потому, что цитаты не закрыты в ячейках файла. Во всяком случае, я решил разделить каждую строку вручную с помощью string.split('\t').

Кроме того, вы пропустили подчеркивание в имени переменной csv_file в нескольких местах в конце, поэтому я добавил их.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...