我使用的是python3.6,我试图从数据集的子组中获取统计信息。例如,主要的分组因素是Uni
和year
。从那里,我想得到一些其他亚组的基本数据,例如,参加理科课程的女性人数或学生人数及其比例。你知道吗
直接计数的风险在于可能会有一些重复计数。 我已经解决了重复计算的问题,但是代码似乎太长了,考虑到有成千上万的学生和更多的大学和年份,第一个分组需要很长时间。 我希望有其他更有效的答案。你知道吗
df1 = pd.DataFrame([('USC', 2009, 'A', 'X', 'Science', 'F', 50),
('USC', 2009, 'A', 'Y', 'Science', 'F', 50),
('USC', 2009, 'A', 'Z', 'Arts', 'F', 500),
('USC', 2009, 'A', 'W', 'Arts', 'F', 50),
('USC', 2009, 'B', 'W', 'Arts', 'M', 500),
('USC', 2009, 'B', 'Z', 'Arts', 'M', 50),
('USC', 2009, 'C', 'X', 'Science', 'F', 50),
('USC', 2009, 'C', 'Y', 'Science', 'F', 500),
('USC', 2009, 'C', 'W', 'Arts', 'F', 50),
('USC', 2010, 'D', 'X', 'Science', 'M', 50),
('USC', 2010, 'D', 'Y', 'Science', 'M', 500),
('USC', 2010, 'D', 'W', 'Arts', 'M', 50),
('USC', 2010, 'E', 'X', 'Science', 'M', 50),
('USC', 2010, 'E', 'Y', 'Science', 'M', 500),
('USC', 2010, 'E', 'W', 'Arts', 'M', 50)],
columns=('Uni', 'year', 'student','course','faculty','gender', 'fee'))
用于编译最终数据的卷积代码是:
# first grouping - eliminating duplicities
data_tmp = df1.groupby(['Uni', 'year','student'])
data_gds = data_tmp.agg({'fee': 'sum'})
data_prc = (data_gds
.join(data_tmp['gender'].apply(lambda x: 1 if (x[x == 'F'].count()>0) else 0))
.join(data_tmp['faculty'].apply(lambda x: 1 if (x[x == 'Science'].count()>0) else 0 ))
.reset_index()
)
# second grouping - eliminating students
data_tmp = data_prc.groupby(['Uni', 'year'])
data_gds = data_tmp['student'].apply(lambda x: x.unique().shape[0]).to_frame('Num_student')
data_prc = (data_gds
.join(data_tmp.agg({'fee': 'sum'}))
.join(data_tmp.agg({'gender': 'sum'}).rename(columns={'gender': 'gender_female'}) )
.join(data_tmp.agg({'faculty':'sum'}).rename(columns={'faculty': 'faculty_Science'}))
.reset_index()
)
# adding percetages here
data_prc['Prc_Female'] = data_prc['gender_female']/data_prc['Num_student']
data_prc['Prc_Science'] = data_prc['faculty_Science']/data_prc['Num_student']
另外,我并不真的需要使用总和费用,但似乎使用聚合允许我使用加入。似乎连接语句需要较长的时间,我希望有一种方法可以避免使用它们(或使其更好)。你知道吗
我们可以大大简化您当前的代码,而且也不需要
lambdas
。你知道吗相关问题 更多 >
编程相关推荐