Добавление строки и столбца из списка в CSV в Python - PullRequest
0 голосов
/ 19 января 2019

Я новичок в python и хочу запустить алгоритм попарного сходства для нескольких векторов (vectors.csv).Каждый вектор является представлением узла.У меня есть файл vectors.csv, который содержит:

    1,2,3
    4,5,6
    7,8,9

, и у меня есть список с y = [56,76,87], изображающий узлы.

Я хочу получить файл .csv, который будет содержать:

    null,56,76,87
    56,1,2,3
    76,4,5,6
    87,7,8,9

Каков наилучший способ сделать это в python3?

Матрица в csvмассив numpy.

Любая помощь будет принята с благодарностью.

Заранее спасибо!

Ответы [ 4 ]

0 голосов
/ 19 января 2019

Позвольте мне в этом разобраться.

"Матрица в csv - это массив numpy."

Не обязательно.Если ваш файл является файлом .csv, то вы можете использовать пакет csv и импортировать данные следующим образом:

import os
import csv

root = r'C:\path\to\my\csv\file'
input_file_name = r'input_data.csv'
output_file_name = r'new_data.csv'

input_path = os.path.join(root, input_file_name)
output_path = os.path.join(root, output_file_name)

Импортировать наши данные:

with open(input_path, 'r', newline ='') as f:
    csv_reader = csv.reader(f, delimiter=',')
    data = [i for i in csv_reader]
f.close()

Тогда выиметь список списков (который похож на массив, но является типом данных списка в Python):

[[' 1', '2', '3'], [' 4', '5', '6'], [' 7', '8', '9']]

Вот наши значения y, которые я предположил, были целыми числами:

y = [56,76,87]

Я позаимствовал полезную функцию здесь: Преобразование элементов списка вложенных списков из строки в целое число в python

def int_conversion(my_list):
    return [int(x) if not isinstance(x, list) else int_conversion(x) for x in my_list]

Наша функция выполняет преобразование некоторых типов данных, но выводит целочисленные значения:

def process_data(my_data=data):
    # copy the raw data list
    new_data = my_data

    # Convert our y values to stings for processing
    y_1 = [str(i) for i in y]

    # Insert each value of our y list at the first spot in each sublist
    for i in range(len(my_data)):
        new_data[i].insert(0, y_1[i])

    # Insert a '0' placeholder at the start of our y list
    y_1.insert(0, '0')

    # Insert the y list as a sublist in our main data list
    new_data.insert(0, y_1)

    # Convert the list values to integers
    new_data = int_conversion(new_data)

    # Replace the first value in the first sublist with a null (None) value
    new_data[0][0] = None

    # Return the results
    return new_data

Обработка, а затем запись вывода:

data = process_data()

with open(output_path, mode='w', newline='') as xyz:
    writer = csv.writer(xyz)
    writer.writerows(data)

Тогда ваш файл должен выглядеть примерно так:

,56,76,87
56,1,2,3
76,4,5,6
87,7,8,9
0 голосов
/ 19 января 2019

pandas может помочь вам.

import pandas as pd
y = [56,76,87]
c=pd.read_csv("vector.csv", names=y)
c.index=y

это даст вам следующее:

    56 76 87
56  1  2  3
76  4  5  6
87  7  8  9

и вы, наконец, экспортируете вновь сгенерированные данные

c.to_csv('new_file.csv')
0 голосов
/ 19 января 2019

Определить массив и список меток:

In [67]: arr = np.arange(1,10).reshape(3,3)
In [68]: y = [56,76,87]

присоединить список меток к массиву:

In [69]: arr1 = np.column_stack((y,arr))

определить строку заголовка:

In [70]: header = 'null,' + ','.join([str(i) for i in y])
In [71]: header
Out[71]: 'null,56,76,87'

написать с savetxt. Обратите внимание на использование заголовка, комментариев и параметров fmt. Поиграйте с ними, если нужно:

In [72]: np.savetxt('test.txt', arr1,header=header, fmt='%d',delimiter=',',comments='')
In [73]: cat test.txt
null,56,76,87
56,1,2,3
76,4,5,6
87,7,8,9

savetxt записывает заголовок с символом комментария. Затем он перебирает строки (1-й dim) массива массива. Для каждой строки выполняется запись fmt%tuple(row), где fmt выводится из вашего параметра. Так что по своей сути это стандартная запись Python файла с форматированными строками.

0 голосов
/ 19 января 2019

Так как концептуально ваша первая строка и первый столбец представляют метки , вы можете рассмотреть Pandas, основанный на объектах массива NumPy:

import pandas as pd
from io import StringIO

x = """1,2,3
4,5,6
7,8,9"""

# read data; replace StringIO(x) with 'file.csv'
df = pd.read_csv(StringIO(x), header=None)

# define column and index properties
idx = [56,76,87]
df.columns = idx
df.index = idx

# export to csv
df.to_csv('out.csv')
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...