熊猫如何创建一个新的数据框,即使在不同的行上也有开始和结束

sec*_*guy 5 python pandas

我有一个带有 2 列的 Pandas 数据框。一些MessageID's在同一行的结尾,它们以NewMessageID下面的索引行 0 中的开头。但是其他像索引第 2 行直到索引第 4 行才结束。我正在寻找一种巧妙的方法来简化新数据帧中的输出。

df
    MessageID   NewMessageID
0   28          10
1   21          9
2   4           18
3   3           6
4   18          22
5   99          102
6   102         118
7   1           20
Run Code Online (Sandbox Code Playgroud)

我正在寻找类似的输出:

df1
    Start  Finish
0   28     10 
1   21     9
2   4      22
3   3      6
4   99     118
5   1      20 
Run Code Online (Sandbox Code Playgroud)

Chr*_*ris 5

加入自身,以创建df2、删除原始行,df这些行在两列之间具有共同的值。保留外面的两列df2并重命名它们以匹配df并将一列附加到另一列。

df = pd.DataFrame({'MessageID':[28,21,4,3,18,99,102,1],'NewMessageID':[10,9,18,6,22,102,118,20]})

df2 = df.merge(df, left_on='NewMessageID', right_on='MessageID')
df2 = df2[['MessageID_x','NewMessageID_y']]
df2.columns = ['MessageID', 'NewMessageID']

df = df[(~df['MessageID'].isin(df['NewMessageID'].values.tolist())) & (~df['NewMessageID'].isin(df['MessageID'].values.tolist()))]

output = df.append(df2)


              MessageID  NewMessageID
    0         28            10
    1         21             9
    3          3             6
    7          1            20
    0          4            22
    1         99           118
Run Code Online (Sandbox Code Playgroud)


use*_*203 2

您可以使用名为的库来解决这个问题networkx

G = (nx.from_pandas_edgelist(
      df, source='MessageID', target='NewMessageID', create_using=nx.DiGraph()))

tc = nx.algorithms.dag.transitive_closure(G)

a = df['MessageID'].to_numpy()
b = df['NewMessageID'].to_numpy()

d = pd.DataFrame(tc.edges)

d[~d[1].isin(a) & ~d[0].isin(b)]
Run Code Online (Sandbox Code Playgroud)

    0    1
0  28   10
1  21    9
3   4   22
5   3    6
7  99  118
9   1   20
Run Code Online (Sandbox Code Playgroud)