从列表创建随机分组

时间:2019-06-24 13:19:51

标签: python

我需要列出500多人的清单,并将其分成15人一组。这些组应该随机分组,这样我们才不会出现在每个人的姓氏以“例如B”。但是我还需要尽可能地平衡15人一组的性别平等。该列表位于具有以下结构的“ students.csv”文件中:


Last, First, ID, Sport, Gender, INT
James, Frank, f99087, FOOT, m, I
Smith, Sally, f88329, SOC, f, 
Cranston, Bill, f64928, ,m,

我一直在寻找某种熊猫的解决方案,但是我对编码的知识有限。到目前为止,我得到的代码只是对数据进行了一些探索。

import pandas as pd
data = pd.read_csv('students.csv', index_col='ID')
print(data)

print(data.Gender.value_counts())

2 个答案:

答案 0 :(得分:1)

我要做的第一件事是过滤成两个列表,每个性别一个:

r = requests.post(url=endpoint , data=payload, headers=headers, params=parameter)
all = r.text # No need to parse this, unless you want to check it's valid
cur.execute('insert into t select * from json_populate_recordset(null::t, %s)', [all])

接下来,调整列表的顺序,以使其更容易选择“随机”,而实际上不必选择随机索引:

males = [d for d in data if d.Gender == 'm']
females = [d for d in data if d.Gender == 'f']

然后,选择元素,同时尝试与性别比例大致保持一致:

random.shuffle(males)
random.shuffle(females)

这将确保每个组中的性别比例尽可能符合原始样本。当然,最后一组将比其他组小,并将包含其他组的“剩下的”。

答案 1 :(得分:0)

使用pandas表示的方法-由15个成员组成的组。其余的属于最后一组。性别比例在某种程度上与熊猫随机化器所允许的精度相同。

import pandas as pd

df = pd.read_csv('1.csv', skipinitialspace=True) # 1.csv contains sample data from the question

# shuffle data / pandas way
df = df.sample(frac=1).reset_index(drop=True)

# group size
SIZE = 15

# create column with group number
df['group'] = df.index // SIZE

# list of groups, groups[0] is dataframe with the first group members
groups = [
    df[df['group'] == num]
    for num in range(df['group'].max() + 1)]

将数据框保存到文件:

# one csv-file
df.to_csv('2.csv')

# many csv-files
for num, group_df in enumerate(groups, 1):
    group_df.to_csv('group_{}.csv'.format(num))