我有一个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。
我需要得到列D上有7个所有行的1个随机行和列D上有2个所有行的1个随机行。
并将结果放在另一个xlsx文件上。
我的预期输出需要是第0,1或2行的内容以及第3,4或5行的内容。
有人可以帮助我吗?谢谢!
我已经创建了代码。下面的代码假定excel名称是test.xlsx,并且与您运行代码的文件夹位于同一文件夹中。它从D列中的每个唯一值中对NrandomLines进行采样并打印出来。
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
使用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)