получить случайный элемент из группы строк в файле xlsx в python - PullRequest
0 голосов
/ 07 марта 2019

У меня есть файл xlsx, например:

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

мои значения (которые на самом деле находятся в файле Excel). Мне нужно, чтобы получить случайные строки этого, но разделены для значений столбца D.

Вы можете заметить, что столбец D имеет значения, равные 7, и значения, равные 2.

Мне нужно получить 1 случайную строку из всех строк, имеющих 7 в столбце D, и 1 случайную строку из всех строк, имеющих 2 в столбце D.

И поместите результаты в другой файл xlsx.

Мой ожидаемый вывод должен содержать содержимое строки 0, 1 или 2 и содержимое строки 3, 4 или 5.

Может ли кто-нибудь помочь мне с этим? Спасибо!

Ответы [ 2 ]

1 голос
/ 07 марта 2019

Я создал код для этого. Приведенный ниже код предполагает, что имя excel - test.xlsx и находится в той же папке, где вы запускаете свой код. Он выбирает NrandomLines из каждого уникального значения в столбце D и печатает его.

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 голос
/ 07 марта 2019

С OpenPyXl вы можете использовать Worksheet.iter_rows для итерации строк рабочего листа.

Вы можете использовать itertools.groupby для группировки строки в соответствии со значениями столбца "D". Для этого вы можете создать небольшую функцию для сбора этого значения в строке:

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

Затем вы можете использовать random.choice для случайного выбора строки.

Собрав все вещи вместе, вы можете иметь:

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)
...