【问题标题】:Create log with change in values in pandas dataframe在熊猫数据框中创建值更改的日志
【发布时间】:2022-01-17 23:13:15
【问题描述】:

我一直在使用具有以下格式的数据框(实际表有更多的行(id)和列(value_3、value_4 等)):

对于每个 id,如果这是该 id 的第一个条目,status 列的值为“new”,如果 value_1value_2 中的任何一个列发生了更改,则值为“modified”到它们之前的值。我想为表中所做的任何更改创建一个日志,特别是我希望上面给定数据的结果格式是这样的:

理想情况下,我想避免使用循环,那么您能否建议任何更有效的pythonic方法来实现上述格式?

我在这里看到了这个问题的答案:Determining when a column value changes in pandas dataframe

这部分完成了我想要的工作(使用shiftdiff)来识别发生变化的案例,我想知道这是否是我的案例的最佳构建方式​​,或者是否有一种更有效的方法来做到这一点并加快进程。理想情况下,我希望在value_1value_2 等列中都可以使用数字和非数字值。

创建第一张图片示例数据的代码:

    import pandas as pd
    data = [[1,2,5,'new'], [1,1,5,'modified'], [1,0,5,'modified'], 
    [2,5,2,'new'], [2,5,3,'modified'], [2,5,4,'modified']  ]
    df = pd.DataFrame(data, columns = ['id', 'value_1', 'value_2', 
   'status'])
    df

非常感谢您的任何建议/帮助!

【问题讨论】:

  • 请提供不在图片中的数据
  • 已编辑问题以包含生成数据的代码@BENY

标签: python pandas dataframe


【解决方案1】:

我们确实需要melt,然后是groupby,然后是drop_duplicates

s = df.melt(['id','status']).drop_duplicates(['id','variable','value'])
s['new'] = s.groupby(['id','variable'])['value'].shift()

s #s.sort_values('id')
    id    status variable  value  new
0    1       new  value_1      2  NaN
1    1  modified  value_1      1  2.0
2    1  modified  value_1      0  1.0
3    2       new  value_1      5  NaN
6    1       new  value_2      5  NaN
9    2       new  value_2      2  NaN
10   2  modified  value_2      3  2.0
11   2  modified  value_2      4  3.0

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 2015-02-15
    • 2018-02-20
    • 2020-04-01
    • 1970-01-01
    • 1970-01-01
    • 2015-06-14
    • 1970-01-01
    相关资源
    最近更新 更多