熊猫数据帧(或python列表/元组)的排序问题



我有一个pandas DataFrame,它看起来像这样:

import pandas as pd
data = [
(638009197035522, 655784141500417), # 0
(693075572527105, 693075572527105), # 1
(655784141500417, 693668642918400), # 2
(693075572527105, 694397537353729), # 3
(694397537353729, 695737600794624), # 4
(695737600794624, 700168400654337), # 5
(693075572527105, 929811762360322), # 6
(929811762360322, 931830115979265), # 7
(931830115979265, 951912745500672), # 8
(951912745500672, 965073687117824)] # 9
pd.DataFrame(data, columns=['reference', 'uid'])

它按第二列(uid(排序。然而,我想实现的是以如下方式对数据帧进行排序(或重建(:

[(638009197035522, 655784141500417), # 0->0
(655784141500417, 693668642918400), # 2->1
(693075572527105, 693075572527105), # 1->2
(693075572527105, 694397537353729), # 3->3
(694397537353729, 695737600794624), # 4->4
(693075572527105, 929811762360322), # 6->5
(695737600794624, 700168400654337), # 5->6
(929811762360322, 931830115979265), # 7->7
(931830115979265, 951912745500672), # 8->8
(951912745500672, 965073687117824)] # 9->9

也就是说,第二列(uid(中的值决定了数据帧/列表中的下一个特定行,但并不总是如您所见。在其原始形状中,它是按uid列排序的,这是可以的,直到有一行带有该uid的引用键。

该解决方案不一定是pandas/dataframe解决方案,纯python解决方案也可以工作。

编辑

正如特德所指出的,我在所需的结果数据中犯了一个错误,我想我也应该对数据和我的目标有更多的了解。该数据是对推特数据样本的模仿,只有引用的推特ID和原始推特的ID,按创建时间排序(升序(。

现在,在示例中,如果reference和id相同,则表示它是会话中的第一个节点。如果不是,那么它就是对另一条推文的回复。

我想保留订单,以防出现例外:

异常1:回复

例外2:对另一个回复的回复,在这里,只要子对话

[(522, 417), # 0->0 # 417, head
(417, 400), # 2->1 # reply to 417 (chronologically after 105)
(105, 105), # 1->2 # 105, new entry, so keep the order for now
(105, 729), # 3->3 # 729, reply to 105
(729, 624), # 4->4 # 624, reply to 729 (a reply to 105)
(624, 337), # 5->5 # 337, reply to 624 (a reply to 729)
(105, 322), # 6->6 # 322, another reply to 105 
(322, 265), # 7->7 # so it goes...
(265, 672), # 8->8
(672, 824)] # 9->9

数据表明这里有两种不同的对话。所以,我想长期保存数据,但在对话(回复(和子对话(回复到回复,…(发生的情况下会破坏数据。

此外,正如邝晃所指出的,我研究了networkx/graph的东西。看起来确实有关联。此外,链表似乎是一个解决方案,但找不到确切的解决方案。

df = pd.DataFrame(data, columns=['reference', 'uid'])
df.sort_values(by="reference", inplace=True)
df
reference       uid
0   638009197035522 655784141500417
2   655784141500417 693668642918400
1   693075572527105 693075572527105
3   693075572527105 694397537353729
6   693075572527105 929811762360322
4   694397537353729 695737600794624
5   695737600794624 700168400654337
7   929811762360322 931830115979265
8   931830115979265 951912745500672
9   951912745500672 965073687117824

然后沿着的路线进行进一步的排序

df['uid'].isin(df['reference'])

最新更新