首页 > 解决方案 > 在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>

我想要做的是分离出三个组abcdefghi。请注意,组的开始将是 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 中应用循环会太慢。我很想给出我的方法,但我完全不知道如何解决这个问题。

标签: pythonpandas

解决方案


棘手的部分是直接排序不起作用,因为它将遵循字典顺序,这意味着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

推荐阅读