python - 在python中识别子和父组合组
问题描述
我在 python 中有以下数据框,其中包含 Child_ID 及其 Parent_ID。
df
Child_ID Parent_ID
0 abc1 abc0
1 ghi7 ghi6
2 ghi1 ghi0
3 ghi0 None
4 ghi10 ghi9
5 abc4 abc3
6 def2 def1
7 abc7 abc6
8 abc6 abc5
9 ghi8 ghi7
10 def4 def3
11 ghi9 ghi8
12 abc2 abc1
13 def0 None
14 ghi6 ghi5
15 abc3 abc2
16 ghi4 ghi3
17 def5 def4
18 abc5 abc4
19 ghi2 ghi1
20 ghi3 ghi2
21 def1 def0
22 abc8 abc7
23 abc0 None
24 def3 def2
25 ghi5 ghi4
数据帧 ID 背后的逻辑是存在三组 ID,即abc<0 到 8>、def<0 到 5>和ghi<0 到 10>。
我想要做的是分离出三个组abc,def和ghi。请注意,组的开始将是 Parent_ID 中包含None值时。最终结果将如下所示
df
Child_ID Parent_ID
0 abc0 None
1 abc1 abc0
2 abc2 abc1
3 abc3 abc2
4 abc4 abc3
5 abc5 abc4
6 abc6 abc5
7 abc7 abc6
8 abc8 abc7
9 def0 None
10 def1 def0
11 def2 def1
12 def3 def2
13 def4 def3
14 def5 def4
15 ghi0 None
16 ghi1 ghi0
17 ghi2 ghi1
18 ghi3 ghi2
19 ghi4 ghi3
20 ghi5 ghi4
21 ghi6 ghi5
22 ghi7 ghi6
23 ghi8 ghi7
24 ghi9 ghi8
25 ghi10 ghi9
注意:这是我创建的示例数据,用于简化包含 800 多列的更复杂的问题。Child_ID 和 Parent_ID 是 16 位随机字母数字值,总行数以百万为单位,包含数千个“组”。因此,在我看来,在 python 中应用循环会太慢。我很想给出我的方法,但我完全不知道如何解决这个问题。
解决方案
棘手的部分是直接排序不起作用,因为它将遵循字典顺序,这意味着2
> 10
。我们可以做的是将数字部分拆分为新列,分别按所有列连接和排序:
df_exp = pd.concat([df[x].str.split('(\d+)', expand=True).add_suffix(x)
for x in df], axis=1)
df_exp_sorted = (df_exp.apply(pd.to_numeric, errors='ignore')
.sort_values(by=df_exp.columns.tolist()))
print(df.iloc[df_exp_sorted.index,:].reset_index(drop=True))
Child_ID Parent_ID
0 abc0 None
1 abc1 abc0
2 abc2 abc1
3 abc3 abc2
4 abc4 abc3
5 abc5 abc4
6 abc6 abc5
7 abc7 abc6
8 abc8 abc7
9 def0 None
10 def1 def0
11 def2 def1
12 def3 def2
13 def4 def3
14 def5 def4
15 ghi0 None
16 ghi1 ghi0
17 ghi2 ghi1
18 ghi3 ghi2
19 ghi4 ghi3
20 ghi5 ghi4
21 ghi6 ghi5
22 ghi7 ghi6
23 ghi8 ghi7
24 ghi9 ghi8
25 ghi10 ghi9
推荐阅读
- spring-boot - Spring数据R2DBC:org.springframework.data.mapping.PropertyReferenceException:没有找到类型的属性findAll
- sql - 连接不存在数据或链接不明显的表
- postgresql - 无法更新视图
- javascript - 正则表达式从开头和结尾提取所有匹配值
- jenkins - Jenkins 没有启动 Xvnc
- visual-studio-code - 更改未保存文件的文件夹位置
- html - 制作一个与前一个相同大小的文本框
- android - 执行 AndroidSchedulers.mainThread() 时出错
- sequelize.js - 从 Sequelize 中检索属性
- node.js - 如何在nodeJs中使函数同步