如何在熊猫数据框中查找值已更改的行?

时间:2020-04-13 21:21:27

标签: python pandas

我处在获取各种项目数据的情况,有时某个项目的某些字段会更改。我正在寻找一种简单的方法来检测何时发生了变化。这是一个例子。假设有这样的话:

df = pd.DataFrame({'ID': [1, 1, 1, 2, 3, 2],
                   'SUBID': [1, 2, 1, 1, 1, 1],
                   'val1': [1, 4, 1, 7, 10, 8],
                   'val2': [2, 5, 2, 8, 11, 9],
                   'val3': [3, 6, 4, 9, 12, 9],
                   'date': ['20200413', '20200413', '20200414', '20200414',
                            '20200415', '20200416']})
ID  SUBID   val1    val2    val3    date
1   1       1       2       3       20200413
1   2       4       5       6       20200413
1   1       1       2       4       20200414
2   1       7       8       9       20200414
3   1       10      11      12      20200415
2   1       8       9       9       20200416

我想给我一个像这样的操作

   ID  SUBID   col      date  prev  new
0   1      1  val3  20200414     3    4
1   2      1  val1  20200416     7    8
2   2      1  val2  20200416     8    9

谢谢!

2 个答案:

答案 0 :(得分:2)

IIUC,您可以执行以下操作:首先用set_indexstack重塑数据框,然后用groupby修改日期agg的某些列,用{{1 }}和/或first,然后last就可以只过滤已更改的内容。

query

答案 1 :(得分:2)

这是我使用GroupBy.shiftDataFrame.melt的方法

new_df = (df.melt(['ID','SUBID','date'], value_name='new')
            .assign(prev=lambda x: x.groupby(['ID','SUBID','variable'])['new']
                                    .shift())
            .loc[lambda x: ~x['new'].eq(x['prev']) & x['prev'].notna()]
            .sort_values(['ID','SUBID']))

print(new_df)
    ID  SUBID      date variable  new  prev
14   1      1  20200414     val3    4   3.0
5    2      1  20200416     val1    8   7.0
11   2      1  20200416     val2    9   8.0
相关问题