我有一个很大的数据集,显示了每个人的学位以及获得学位的年份。此外,每个人都有一个相应的ID。我试图用学位完成的年份和学位完成的平均年龄来查找每个人的出生年份。数据集如下所示:
就平均年龄而言,我假设33岁完成博士学位,30岁完成硕士学位,22岁完成学士学位
person_id degree degree_completion year_of_birth
1 PhD 2006 1973
1 BSc 1999 1977
2 Ph.D. 1995 1962
2 MBA 2000 1970
2 B.A. 1987 1965
3 Bachelor of Engineering 2005 1983
4 AB 1997 1975
4 Doctor of Philosophy (PhD) 2003 1970
我已经创建了一个系统来计算每个人的出生年份,但我不知道如何创建一个优先级系统,以便它选择正确的出生年份,因为可以为每个人的不同程度计算不同的出生年份。我想要以下优先顺序:学士学位出生年份>;博士生出生年份>;硕士生年
我用groupby函数和Categorial数据类型尝试了很多方法。此外,数据集中有数百种不同的学位形式,因此我一直依赖于使用正则表达式来计算出生年份和创建优先级系统。这是我目前拥有的,但我找不到一种方法来将regex实现到:
category1 = "^B[a-z]*|AB|A.B.|A.B|S.B."
category2 = "^P[a-z]*|Doctor of Philosophy[a-z]*"
category3 = "^M[a-z]*|Master[a-z]*"
file['edu_degree'] = pd.Categorical(file['edu_degree'], ordered=True, categories=[category1, category2, category3])
file.groupby('person_id')['edu_degree'].transform('max')
此外,这将是我期望的输出(出生年份根据优先级进行替换):
person_id degree degree_completion year_of_birth
1 PhD 2006 1977
1 BSc 1999 1977
2 Ph.D. 1995 1965
2 MBA 2000 1965
2 B.A. 1987 1965
3 Bachelor of Engineering 2005 1983
4 AB 1997 1975
4 Doctor of Philosophy (PhD) 2003 1975
这是一个可能的解决方案,也许不是最优雅的解决方案,但仍能发挥作用
这里有一个想法,可能不是最优雅的(假设您的框架名为
df
):一些解释:
步骤1:对正则表达式进行一点重新组织
我已经调整了模式,以便(1)匹配列
degree
的完整条目,(2)包含更多可能性,(3)转义.
很可能您必须进一步调整它和我将类别分组,并通过|
将它们连接起来步骤2:创建
degree_cat
列(=相应学位的类别)我使用了
category
作为repl
函数,它本质上用它们的类别替换匹配项。检查一下它是如何工作的。这个strip
只是一个预防措施。示例的结果列如下所示:步骤3:选择所需的出生年份
这里
df
按新列排序,按person_id
分组,然后选择year_of_birth
中的第一项(这是排序所需的年份)。您的样本结果:步骤4:用所需的值替换
year_of_birth
中的值删除旧的
year_of_birth
和degree_cat
列,因为它们不再需要了,然后沿person_id
合并df
上的df_year_of_birth
数据帧,以重新创建右侧的year_of_birth
列最终结果:
要应用正则表达式,可以创建一个函数(
get_diploma
)来逐个测试它们。理想情况下,按最可能的顺序排列(学士优先)然后,您可以按person_id进行分组,并找到具有最高优先级的行(
get_expected_age
函数)输出:
相关问题 更多 >
编程相关推荐