[Python] Copier aléatoirement des rangées à p

Fermé
Antonin - 25 oct. 2008 à 16:50
 Antonin - 26 oct. 2008 à 19:02
Bonjour,

J'ai un fichier CSV de 8000 lignes et 30 colonnes. J'aimerais copier les colonnes 8 à 30 environ n=300 fois dans mon fichier CSV, à droite des données existantes, avec une condition :

J'aimerais "randomiser" les lignes (les copier en les ayant préalablement mélangées) de telle manière qu'il n'y ait pas deux mêmes lignes initiales dans ma ligne finale (concrètement, après mes 300 copies, j'aimerais qu'il n'y ait pas deux fois la même ligne du tableau d'origine dans la même ligne, exemple : a,b,c;d,e,f;g,h,i;j,k,l et n=2 copies. Résultat : a,b,c,g,h,i,d,e,f;d,e,f,g,h,i,a,b,c;g,h,i,a,b,c,j,k,l;j,k,l,d,e,f,a,b,c) (est-ce clair ?) (je ne veux pas avoir a,b,c,g,h,i,d,e,f,g,h,i car il y a deux fois g,h,i)

De plus, et c'est un détail, j'aimerais que la première ligne, contenant les headers, soit copiée en ajoutant _1 pour la première copie, _2 pour la 2e, ... _n pour la n-ième (exemple : header original : a, b, c; header résultat : a, b, c, a_1, b_1, c_1, ... a_n, b_n, c_n)

Ça peut avoir l'air simple, mais je n'y arrive pas.

Merci pour votre aide !

Antonin
A voir également:

4 réponses

kilian Messages postés 8731 Date d'inscription vendredi 19 septembre 2003 Statut Modérateur Dernière intervention 20 août 2016 1 527
26 oct. 2008 à 16:30
Ok. Et qu'est ce qui te pose problème là dedans du coup?
1
Bon, j'explique encore une fois, différemment, en espérant que je serai plus clair.

J'ai un tableau de données au format csv.
Ce tableau contient 8000 lignes et 30 colonnes.
J'aimerais copier ces lignes à droite des données existantes. Donc après une copie, j'aurai un tableau de 8000 lignes toujours, mais de 60 colonnes (vous me direz qu'on peut faire ça sous Excel, et je suis d'accord, mais si vous faites non pas une copie mais 300 copies, Excel n'arrive plus).

Est-ce que jusqu'ici c'est clair ?

Ensuite, j'ajoute une contrainte. Je souhaite mélanger les lignes quand je les copies. Donc la ligne 1 sera copiée à la position 4384 par exemple, et la 2 à la 121, etc.

Finalement, j'ajoute une dernière contrainte. J'aimerais que lorsque je les copie, je ne les copies jamais deux fois à la même place. La première ligne du tableau que je souhaite obtenir à la fin contiendra par exemple sur la 1e ligne les lignes originales 1, puis 453, puis 7832, puis 4, puis 987, etc. 300 fois sans jamais en contenir deux fois la même.

Ensuite, j'aimerais aussi traiter les headers, mais bon, c'est un détail.
0
J'ai de la peine à manipuler les fichiers CSV et en gros à faire du copier coller.

J'importe d'abord les outils nécessaire :

import random
import csv

J'ouvre mes fichiers :

cr=csv.reader(open("data.csv",'rb'), delimiter=';')
cw=csv.writer(open("result.csv", 'wb'))

Et j'arrive à générer la liste des numéros de lignes que j'aimerais copier :

random.sample(xrange(8000),n)

Ceci va générer une liste n éléments entre 1 et 8000 sans avoir deux fois la même valeur. Et c'est précisément ce que je cherche à obtenir.

Reste plus ensuite qu'à copier les valeurs du fichier d'origine dans le fichier résultat, en copiant les lignes les unes après les autres dans l'ordre obtenu plus haut. Et là, je n'y arrive pas. Je ne vois pas trop comment accéder aux lignes et à les copier...
0
kilian Messages postés 8731 Date d'inscription vendredi 19 septembre 2003 Statut Modérateur Dernière intervention 20 août 2016 1 527
25 oct. 2008 à 17:02
J'ai rien compris :-s
-1