我有一个带有 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)
加入自身,以创建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)
您可以使用名为的库来解决这个问题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)
| 归档时间: |
|
| 查看次数: |
603 次 |
| 最近记录: |