我需要列出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())
答案 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))