J'ai un fichier xlsx, par exemple:

A  B  C  D  E  F  G
1  5  2  7  0  1  8
3  4  0  7  8  5  9
4  2  9  7  0  6  2
1  6  3  2  8  8  0
4  3  5  2  5  7  9
5  2  3  2  6  9  1

Étant mes valeurs (qui sont en fait sur un fichier Excel). J'ai besoin d'en obtenir des lignes aléatoires, mais séparées pour les valeurs de la colonne D.

Vous pouvez noter que la colonne D a des valeurs qui sont 7 et des valeurs qui sont 2.

J'ai besoin d'obtenir 1 ligne aléatoire de toutes les lignes qui ont 7 sur la colonne D et 1 ligne aléatoire de toutes les lignes qui en ont 2 sur la colonne D.

Et mettez les résultats sur un autre fichier xlsx.

Ma sortie attendue doit être le contenu de la ligne 0, 1 ou 2 et le contenu de la ligne 3, 4 ou 5.

Quelqu'un peut-il m'aider avec ça? Merci!

-1
Ally 7 mars 2019 à 18:11

2 réponses

Meilleure réponse

J'ai créé le code pour ça. Le code ci-dessous suppose que le nom Excel est test.xlsx et réside dans le même dossier que celui où vous exécutez votre code. Il échantillonne NrandomLines à partir de chaque valeur unique dans la colonne D et l'imprime.

import pandas as pd
import numpy as np
import random
df = pd.read_excel('test.xlsx') # read the excel

vals = df.D.unique() # all unique values in column D, in your case its only 2 and 7

idx = []
N = []
for i in vals: # loop over unique values in column D
    locs = (df.D==i).values.nonzero()[0]
    idx = idx + [locs]  # save row index of every unique value in column D    
    N = N + [len(locs)] # save how many rows contain specific value in D



NrandomLines = 1 # how many random samples you want 

for i in np.arange(len(vals)): # loop over unique values of D
    for k in np.arange(NrandomLines): # loop how many random samples you want 
        randomRow = random.randint(0,N[i]-1) # create random sample

        print(df.iloc[idx[i][randomRow],:])  # print out random row
1
EddyG 7 mars 2019 à 15:32

Avec OpenPyXl, vous pouvez utiliser Worksheet.iter_rows pour itérer les lignes de la feuille de calcul.

Vous pouvez utiliser itertools.groupby pour grouper la ligne en fonction des valeurs de la colonne "D". Pour ce faire, vous pouvez créer une petite fonction pour récupérer cette valeur dans une rangée:

def get_d(row):
    return row[3].value

Ensuite, vous pouvez utiliser random.choice pour choisir une ligne au hasard.

En rassemblant toutes choses, vous pouvez avoir:

def get_d(row):
    return row[3].value


for key, group in itertools.groupby(rows, key=get_d):
    row = random.choice(list(group))
    print(row)
1
Laurent LAPORTE 7 mars 2019 à 15:29