下面是我的示例表:
id nv ov date
1 1 0 01/02/2023
1 2 1 01/02/2023
1 5 4 01/03/2023
1 1 3 01/02/2023
1 4 1 01/02/2023
1 3 2 01/02/2023
1 6 5 01/03/2023
1 7 6 01/04/2023
1 7 7 01/04/2023
其中nv
是新值,ov
是旧值。
我想根据新值和旧值之间的正确更改日志对所有行进行排序,即上一行的新值应与当前行的旧值匹配。
另外,如果有多个新值与旧值匹配的情况,则只向前取正确的情况,例如,在(1,0)之后,我可以转到(2,1)或(4,1);但(2,1)是正确的日志,因为它将覆盖所有转换。如果此时选择(4,1)作为行号3,则不会覆盖所有更改日志。旧值为空的行将始终是第一行。
- (PS:我确实有一个日期列,但在同一天发生了多个转换。在这种情况下,如何确定上述用例中这些转换的正确顺序?例如,从1到2和从1到4的转换发生在同一天。)*
我们可以在pandas/python中执行此操作吗?
预期输出:
id nv ov date rn
1 1 0 01/02/2023 1
1 2 1 01/02/2023 2
1 3 2 01/02/2023 3
1 1 3 01/02/2023 4
1 4 1 01/02/2023 5
1 5 4 01/03/2023 6
1 6 5 01/03/2023 7
1 7 6 01/04/2023 8
1 7 7 01/04/2023 9
1条答案
按热度按时间ruoxqz4g1#
您可以在
networkx
的帮助下使用图形方法来解决这个问题。下面是您的图表:
这里我们将确定根和叶(我假设它们是唯一的),并计算排除了
all_simple_edge_paths
的循环的简单路径,然后我们用simple-cycles
确定所有循环,并用dfs_edges
迭代它们的边,以添加一个子排序键(这里是排序键的小数部分)这将为每条边产生以下"顺序",然后我们将使用该顺序进行排序:
将添加"order"列的
sorter
函数的代码(前提条件:没有重复的边,只有一个根和叶,尽管可以更新代码以处理更多的情况):然后运行:
如果要按组排序,请使用
groupby.apply
中的函数:输出:
可重现输入: