我希望比我更有知识的人能在我脱发之前提供一些智慧
我有一个像这样的数据框
Date Unit Length AM/PM unit_new
5 Monday\r13 January 12345H\rEngineering - Unit 1: Engineering Principles\r23456H\rHealth and Social Care - Unit 2: Working in Health\rand Social Care 2h 00m\r1h 30m morning
6 Tuesday\r14 January 34567H\rBusiness/Enterprise and Entrepreneurship -\rUnit 3: Personal and Business Finance\r12345L\rApplied Human Biology - Unit 1: Principles of\rHuman Biology\r23456K\rConstruction and the Built Environment -\rUnit 1: Construction Principles 2h 00m\r1h 30m\r1h 30m morning
7 Wednesday\r15 January 34567H/1C\rApplied Science/Forensic and Criminal Investigation\r- Unit 1: Principles and Applications of Science I -\rChemistry\r12345H\rSport and Exercise Science - Unit 1: Sport and Exercise\rPhysiology 0h 40m\r1h 30m morning
现在的问题是,‘Unit’列在每一行上都有多条数据记录,但每一行上的记录数并不一致。“长度”列的设置与“单位”列相同。“日期”和“上午/下午”列只有一个条目
这张图片更好地解释了这个问题。第5行有两条记录,一条用于工程,一条用于HSC,长度列如下。两个记录的“日期”和“上午/下午”相同。第6行有三条记录,第7行有两条记录
现在我要做的是将每条记录拆分到自己的行中。在尝试这样做的过程中,我尝试了许多不同的方法,但没有取得多少进展
方法想法一 我的第一个想法是尝试在相关行下添加新行,并从“单位”和“长度”列提取数据,同时从“日期”和“AM/PM”列复制数据。这被证明是一个技巧,因为插入到df的中间使其更加复杂
方法理念二 接下来,我想在df的底部追加行,稍后再进行排序
所以我写了一个函数,计算每行的记录数,并输出到一个系列
def code_count_func():
code_count = df.Unit.str.count('\d{5}\w').subtract(+1)
# drop na's to stop error
code_count.dropna(inplace = True)
# converting to int
code_count = code_count.iloc[0:].astype(int)
下面的代码是我目前正在尝试的,它在一个名为“unit_new”的新列中拆分成一个字符串列表,但根据我的彩色图像,正则表达式并没有完全捕捉到
for index, row in code_count_func().iteritems():
df['unit_new'] = df.Unit.str.split('(\d{5}\w)')
第二个问题是,我也不知道如何找到这个程序。我正在考虑使用DataFrame.explode
方法,但我不确定如何在“单位”和“长度”列上使用该方法,而只是从“日期”和“am/PM”列复制
有人能给我一些关于如何使用爆炸法或类似方法的指导吗。另外,如果有人能够帮助我的正则表达式,请
更多关于正则表达式的问题。因此,与“单位”列中的模式一致的是五位数和一个字母,例如12345K,用于每个新记录的开头。看第5行,我想得到这个:-
12345H\重新设计-第1单元:工程原理\r\n 23456H\r健康和社会护理-第2单元:在健康和社会护理领域工作
我尝试了许多模式,但没有运气
所需输出
这可能会起作用,如果使用更精细的正则表达式,效果会更好。我的列可能已从复制/粘贴过程中关闭,但逻辑应该正确
拿到单位
df['Unit'] = df['Unit'].str.split('(.+?(?=\d{5}))')
了解长度
lengths = df['AM/PM'].str.split(r'\\r').explode()
分解单元,从正则表达式中删除空条目,并将长度返回到数据帧
df = pd.concat([df.explode('Unit').query("Unit != ''"), lengths], axis=1)
相关问题 更多 >
编程相关推荐