Python跟踪多列值的变化
Posted
技术标签:
【中文标题】Python跟踪多列值的变化【英文标题】:Python Tracking change in values across multiple columns 【发布时间】:2022-01-20 13:00:41 【问题描述】:我有一个特定的场景,我有一个包含历史记录的数据集,如果某个 ID 的最新条目与最后一个条目不同,我需要能够标记。
例如,这里是启动器 df 的示例快照:
ID | A | B | C | Close Date |
---|---|---|---|---|
111 | 0 | 1 | 0 | 10-1-2021 |
111 | 0 | 1 | 0 | 11-1-2021 |
111 | 1 | 1 | 1 | 12-1-2021 |
222 | 0 | 0 | 0 | 9-1-2021 |
222 | 0 | 0 | 0 | 10-1-2021 |
333 | 0 | 0 | 0 | 8-1-2021 |
333 | 0 | 1 | 1 | 12-1-2021 |
我想要的样子:
ID | A | B | C | Close Date |
---|---|---|---|---|
111 | 1 | 1 | 1 | 12-1-2021 |
333 | 0 | 1 | 1 | 12-1-2021 |
如果没有更改的条目被删除,并且任何给定列中具有某种类型更改的条目不同,并且最近的记录根据最近的日期保留。
我试过这段代码:
df = df[df[['ID', 'A','B', 'C', '截止日期']].duplicated() == False]
但意识到这并不能完全捕捉到这种情况的所有情况。如果每个 ID 的最新条目与以前的条目不同,是否有更简单的方法来比较?
编辑:
如果表中包含整数列和字符串列怎么办?
ID | A | B | C | D | Close Date |
---|---|---|---|---|---|
111 | 0 | 1 | 0 | abcd | 10-1-2021 |
111 | 0 | 1 | 0 | efgh | 11-1-2021 |
111 | 1 | 1 | 1 | ijkl | 12-1-2021 |
222 | 0 | 0 | 0 | mnop | 9-1-2021 |
222 | 0 | 0 | 0 | qrst | 10-1-2021 |
333 | 0 | 0 | 0 | uvwx | 8-1-2021 |
333 | 0 | 1 | 1 | yzzz | 12-1-2021 |
那么我如何才能检查每个 ID 的最后两个条目是否相同?如果是,则删除该 ID 的所有实例。
【问题讨论】:
" 如果某个 ID 的最新条目与最后一个条目不同。" ?你能重述或澄清一下吗? 当然可以。我只是想比较最后一个条目的 ID 是否有变化。假设每个日期都是一个新的月份。因此,如果一个人(ID)从 10 月开始的信息与 11 月相同,这没有变化,我们删除了这条记录。如果此人 11 月的数据不同,这是我想跟踪并保留在 df.xml 中的更改。如果我能澄清更多,请告诉我。 您能否更新您的数据框示例以包含Close Date
?这个例子看起来有点不直观。您不想从重复的集合中保留至少一条记录吗? (如 111-0,1,0)
对于我的具体情况,我有一个报告有逻辑表明更新中是否不存在记录,那么就没有变化。在之前的报告中有记录,这就是为什么在这种情况下无关紧要。我更新了关闭日期
@ek11222 牢记这一点,我已经尝试了一个可行的解决方案。看看它是否对你的整个数据集都有效
【参考方案1】:
我认为这会为您提供所需的输出以及原始行号。由于您没有提供 D 列,因此我使用了列列表进行比较。如果尚未完成,可能有助于按日期排序。可能会错过一些边缘情况,我认为如果只有一个 ID 条目,如果您可以使用有问题的行更新示例,我可以再看一下。
df = pd.DataFrame(
[
[111, 0,1,0],
[111, 0,1,0],
[111, 1,1,1],
[222, 0,0,0],
[222, 0,0,0],
[333, 0,0,0],
[333, 0,1,1]
],
columns=["ID", "A","B","C"])
cols_to_check = ["A","B", "C"]
res = df.groupby(
'ID', as_index=False
).apply(
lambda x: x[1:][(x[cols_to_check][1:] != x[cols_to_check].shift().dropna()).any(axis=1)])
【讨论】:
感谢您的解决方案,这确实适用于数字列并且非常彻底。如果列中有混合的数据类型会怎样?例如,A 列的每一行都包含字符串,而所有其他列保持不变。 好吧,我花了一点时间来准确理解,但正如我现在所看到的那样,任何 id 的第一行都会被丢弃。我已经更新了答案,试一试它应该适用于所有情况。如果您不想要多级数据框,请删除索引。以上是关于Python跟踪多列值的变化的主要内容,如果未能解决你的问题,请参考以下文章
如何在 python 的帮助下跟踪和显示 HDF5 文件中所做的不断变化