Python对字符串进行样条处理,添加行,每列不同

2024-10-02 16:23:32 发布

您现在位置:Python中文网/ 问答频道 /正文

我希望比我更有知识的人能在我脱发之前提供一些智慧

我有一个像这样的数据框

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行有两条记录

dataframe

现在我要做的是将每条记录拆分到自己的行中。在尝试这样做的过程中,我尝试了许多不同的方法,但没有取得多少进展

方法想法一 我的第一个想法是尝试在相关行下添加新行,并从“单位”和“长度”列提取数据,同时从“日期”和“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单元:在健康和社会护理领域工作

我尝试了许多模式,但没有运气

所需输出

output


Tags: and数据方法dfnewcount记录code
1条回答
网友
1楼 · 发布于 2024-10-02 16:23:32

这可能会起作用,如果使用更精细的正则表达式,效果会更好。我的列可能已从复制/粘贴过程中关闭,但逻辑应该正确

拿到单位

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)

            Date           ...                                               Unit   AM/PM
5     Monday\r13  January  ...  12345H\rEngineering - Unit 1: Engineering Prin...  2h 00m
5     Monday\r13  January  ...  23456H\rHealth and Social Care - Unit 2: Worki...  1h 30m
6    Tuesday\r14  January  ...  34567H\rBusiness/Enterprise and Entrepreneursh...  2h 00m
6    Tuesday\r14  January  ...  12345L\rApplied Human Biology - Unit 1: Princi...  1h 30m
6    Tuesday\r14  January  ...  23456K\rConstruction and the Built Environment...  1h 30m
7  Wednesday\r15  January  ...  34567H/1C\rApplied Science/Forensic and Crimin...  0h 40m
7  Wednesday\r15  January  ...  12345H\rSport and Exercise Science - Unit 1: S...  1h 30m

相关问题 更多 >