当只有前置id和后继id已知时,确定元素id的简洁方法—Python

当只有前置id和后继id已知时,确定元素id的简洁方法—Python,python,pandas,list,dataframe,Python,Pandas,List,Dataframe,我遇到了以下情况: “我的输入数据”包含多个元素,这些元素具有前置id和后继id,但不是其自己的id。 如下表所示 +----------+-------------+-------------+ |元素|下一个块ID |上一个块ID| +----------+-------------+-------------+ |区块623 | c308002017 | 2A0803017| +----------+-------------+-------------+ |区块625 | 0 | c30

我遇到了以下情况:
“我的输入数据”包含多个元素,这些元素具有前置id和后继id,但不是其自己的id。
如下表所示
+----------+-------------+-------------+
|元素|下一个块ID |上一个块ID|
+----------+-------------+-------------+
|区块623 | c308002017 | 2A0803017|
+----------+-------------+-------------+
|区块625 | 0 | c308002017|
+----------+-------------+-------------+
|区块622 | 2808003017 | c208002017|
+----------+-------------+-------------+
|区块620 | c208002017 | 0|
+----------+-------------+-------------+
|区块621 | 2A0803017 | BE0803017|
+----------+-------------+-------------+
|区块624 | 2908002017 | 2808003017|

+----------+-------------+-------------+
要弄清楚您要寻找的逻辑有点困难,但这段代码会产生您期望的输出:

df = df.sort_values("Element")
df["ElementID"] = df.PrevBlockID.shift(-1)
df.loc[df.ElementID.isna(), "ElementID"] = df.NextBlockID.shift()
df.sort_index(inplace = True)
输出为:

    Element NextBlockID PrevBlockID   ElementID
0  Block623  c308002017  2a08003017  2808003017
1  Block625           0  c308002017  2908002017
2  Block622  2808003017  c208002017  2a08003017
3  Block620  c208002017           0  be08003017
4  Block621  2a08003017  be08003017  c208002017
5  Block624  2908002017  2808003017  c308002017

要弄清楚您要寻找的逻辑有点困难,但这段代码会产生您期望的输出:

df = df.sort_values("Element")
df["ElementID"] = df.PrevBlockID.shift(-1)
df.loc[df.ElementID.isna(), "ElementID"] = df.NextBlockID.shift()
df.sort_index(inplace = True)
输出为:

    Element NextBlockID PrevBlockID   ElementID
0  Block623  c308002017  2a08003017  2808003017
1  Block625           0  c308002017  2908002017
2  Block622  2808003017  c208002017  2a08003017
3  Block620  c208002017           0  be08003017
4  Block621  2a08003017  be08003017  c208002017
5  Block624  2908002017  2808003017  c308002017

这和你想要的一样吗?嗨,谢谢你的输入。shift命令在这里非常方便。这正是我想要的。它工作并创建我想要的输出,但不幸的是,我不能依赖元素列的正确顺序。里面可能有任何免费的字符串。我的数据摘录可能是我的一个坏例子。在没有元素列的情况下,有什么方法可以做到这一点吗?如果你迭代,你必须有一些顺序。您要什么样的订单?换句话说,你在文章标题中提到的“前任和继任者”是什么?更一般地说,如果你能解释一下你要做的事情的逻辑,那就太好了。嗨,罗伊,我编辑了我最初的帖子,并把我的代码放在那里。我不想要任何具体的订单。我得到的是外部数据,其中包含相互链接的块的信息。因此,每个块都紧跟着另一个块,并带有前置块(PrevBlockID)和后继块(NextBlockID)。块本身可以有任何名称。我缺少的信息是块ID(示例中我的列ElementID)。我要找的是一种获取元素ID的方法。我找到了一个,但在我看来,它似乎不是很有效。。。考虑到我以后在数据框中将有大约10万行,那么ID(elementID、nextBlockID或prevBlockID)是按字典编纂器顺序排列的吗?也就是说,这样做是否有意义?或者,它只是一个对名字没有意义的双链接列表?这和你想要的一样吗?嗨,谢谢你的输入。shift命令在这里非常方便。这正是我想要的。它工作并创建我想要的输出,但不幸的是,我不能依赖元素列的正确顺序。里面可能有任何免费的字符串。我的数据摘录可能是我的一个坏例子。在没有元素列的情况下,有什么方法可以做到这一点吗?如果你迭代,你必须有一些顺序。您要什么样的订单?换句话说,你在文章标题中提到的“前任和继任者”是什么?更一般地说,如果你能解释一下你要做的事情的逻辑,那就太好了。嗨,罗伊,我编辑了我最初的帖子,并把我的代码放在那里。我不想要任何具体的订单。我得到的是外部数据,其中包含相互链接的块的信息。因此,每个块都紧跟着另一个块,并带有前置块(PrevBlockID)和后继块(NextBlockID)。块本身可以有任何名称。我缺少的信息是块ID(示例中我的列ElementID)。我要找的是一种获取元素ID的方法。我找到了一个,但在我看来,它似乎不是很有效。。。考虑到我以后在数据框中将有大约10万行,那么ID(elementID、nextBlockID或prevBlockID)是按字典编纂器顺序排列的吗?也就是说,这样做是否有意义?或者,它只是一个没有名字意义的双链接列表?