2
votes

Ajouter une ligne et une colonne d'une liste à un csv en python

Je suis nouveau dans Python et je souhaite exécuter un algorithme de similarité par paires sur un tas de vecteurs (vectors.csv). Chaque vecteur est une représentation d'un nœud. J'ai un fichier vectors.csv qui contient:

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

et j'ai une liste qui a y = [56,76,87] représentant les nœuds.

Je veux obtenir un fichier .csv qui contiendra:

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

Quelle est la meilleure façon de faire cela en python3?

La matrice dans le csv est un tableau numpy.

Toute aide serait grandement appréciée.

Merci d'avance!


2 commentaires

Joignez la liste au tableau (concaténer), puis utilisez savetxt sur le nouveau tableau.


Vous pouvez utiliser pandas.DataFrame (matrix, index = [56,76,87], columns = [56,76,87]) . Dans numpy, ce sera un peu gênant car le [0, 0] est manquant et je suppose que vous ne voulez pas exécuter de calculs sur les identifiants de nœud.


4 Réponses :


-1
votes

Étant donné que, conceptuellement, votre première ligne et votre première colonne représentent des étiquettes , vous voudrez peut-être considérer Pandas, qui s'appuie sur des objets de tableau 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')


0 commentaires

0
votes

pandas peut vous aider.

c.to_csv('new_file.csv')

cela vous donnera:

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

et vous enfin exporter les données nouvellement générées

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


0 commentaires

0
votes

Définissez le tableau et la liste d'étiquettes:

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

joignez la liste d'étiquettes au tableau:

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

définissez une ligne d'en-tête: p>

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

écrire avec savetxt . Notez l'utilisation de l'en-tête, des commentaires et des paramètres fmt. Jouez avec ceux-ci si nécessaire:

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

savetxt écrit l'en-tête avec le caractère de commentaire. Ensuite, il itère sur les lignes (1er dim) du tableau. Pour chaque ligne, il effectue une écriture fmt% tuple (row) , où fmt est dérivé de votre paramètre. Donc, à la base, c'est une écriture de fichier Python standard de lignes formatées.


0 commentaires

0
votes

Permettez-moi de répondre à ceci.

"La matrice dans le csv est un tableau numpy."

Pas nécessairement. Si votre fichier est un fichier .csv, vous pouvez utiliser le package csv et importer des données comme ceci:

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

Importez nos données:

data = process_data()

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

Ensuite, vous aurez une liste de listes (qui est comme un tableau, mais est un type de données de liste en Python):

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

Voici nos valeurs y, que je supposais être des entiers:

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

J'ai emprunté une fonction utile à partir d'ici: Conversion des éléments de la liste des imbriqués listes d'une chaîne à un entier en python

y = [56,76,87]

Notre fonction effectue une conversion de type de données, mais génère des valeurs entières:

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


0 commentaires