gpt4 book ai didi

Python pandas 夹板字符串,添加行,每列不同

转载 作者:太空宇宙 更新时间:2023-11-03 19:51:31 26 4
gpt4 key购买 nike

我希望在我拔掉所有头发之前,比我更有知识的人可以提供一些智慧。

我有一个看起来像这样的数据框

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 行有两条记录,一条用于 Engineering,一条用于 HSC,长度列也如此。两条记录的“日期”和“上午/下午”相同。第 6 行有 3 条记录,第 7 行有 2 条记录。

dataframe

现在我想做的是将每个记录拆分到其自己的行中。为了做到这一点,我尝试了多种不同的方法,但没有取得多大进展。

方法思路一我的第一个想法是尝试在相关行下添加新行,并从“单位”和“长度”列中提取数据,同时从“日期”和“上午/下午”列复制数据。事实证明这是一个技巧,因为插入 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 方法,但我不确定如何在“单位”和“长度”列上使用它,而只是从“日期”和“上午/下午”列复制。

有人可以给我一些关于如何使用爆炸方法或类似方法的指导吗?另外,如果有人能够帮助我的正则表达式,请。

更多关于正则表达式问题。因此,与“单位”列中的模式一致的一件事是五位数字和一个字母,例如12345K 用于每个新记录的开始。所以看第 5 行我想得到这个:-

12345H\r工程 - 第 1 单元:工程原理\r23456H\r健康和社会关怀 - 第 2 单元:从事健康\r和社会关怀

我尝试了多种模式,但没有成功。

所需输出

output

最佳答案

这可能有效,并且使用更精细的正则表达式可能会更好。我的专栏可能脱离了复制/粘贴过程,但逻辑应该是正确的

获取单位

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

关于Python pandas 夹板字符串,添加行,每列不同,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/59815291/

26 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com