为了账号安全,请及时绑定邮箱和手机立即绑定

如何从 Pandas DataFrame 中的特定行开始检测过去 2 个月的变化

如何从 Pandas DataFrame 中的特定行开始检测过去 2 个月的变化

倚天杖 2022-01-05 10:33:51
假设我们有一个这样的数据框:Id  Policy_id   Start_Date  End_Date    Fee1    Fee2    Last_dup0   b123        2019/02/24  2019/03/23  0       23      01   b123        2019/03/24  2019/04/23  0       23      02   b123        2019/04/24  2019/05/23  10      23      13   c123        2018/09/01  2019/09/30  10      0       04   c123        2018/10/01  2019/10/31  10      0       15   d123        2017/02/24  2019/03/23  0       0       06   d123        2017/03/24  2019/04/23  0       0       1该列Last_dup是应用.duplicated( answer )的结果。在这种情况下,End_Date和的减法结果Start_Date始终为30天以进行简化。我的目标是检测的变化Fee1,并Fee2在过去的2个月为每个Policy_id。所以首先,我想找到最后一个元素,Policy_id然后从最后一个元素开始,比较几个月之间的费用并检测变化。预期结果:Id  Policy_id   Start_Date  End_Date    Fee1    Fee2    Last_dup    Changed0   b123        2019/02/24  2019/03/23  0       23      0           01   b123        2019/03/24  2019/04/23  0       23      0           02   b123        2019/04/24  2019/05/23  10      23      1           13   c123        2018/09/01  2019/09/30  10      0       0           04   c123        2018/10/01  2019/10/31  10      0       1           05   d123        2017/02/24  2019/03/23  0       0       0           06   d123        2017/03/24  2019/04/23  0       0       1           0我要开始为特定行,其中Last_dup被1然后上去和比较的变化FeeX。谢谢!
查看完整描述

1 回答

?
侃侃尔雅

TA贡献1801条经验 获得超16个赞

我认为为每项政策添加一个“交易编号列”会使这更容易。然后您可以对事务进行重复数据删除以查看是否有“更改”的行。


看下面的例子:


import pandas as pd


dat = [['b123', 234, 522], ['b123', 234, 522], ['c123', 34, 23], 

['c123', 38, 23], ['c123', 34, 23]]


cols = ['Policy_id', 'Fee1', 'Fee2']


df = pd.DataFrame(dat, columns=cols)


df['transaction_id'] = 1

df['transaction_id'] = df.groupby('Policy_id').cumsum()['transaction_id']


df2 = df[cols].drop_duplicates()


final_df = df2.join(df[['transaction_id']])

输出是:


      Policy_id  Fee1  Fee2  transaction_id

0      b123   234   522               1

2      c123    34    23               1

3      c123    38    23               2

而且由于b123去重后只有一笔交易,所以您知道没有任何变化。有些东西必须改变c123。


您可以使用final_df[final_df.transaction_id > 1].


如前所述,您可能需要对日期进行一些其他数学计算,但这应该可以帮助您完成大部分工作。


编辑:如果您只想查看最近两个月,您可以在运行上述之前过滤 DataFrame。


这个怎么做:


为过滤日期创建一个变量,如下所示:


from datetime import date, timedelta

filtered_date = date.today() - timedelta(days=60)

然后我会使用这个pyjanitor包来使用它的 filter_date 方法。只需过滤您想要的列;我认为这Start_date看起来最合理。


import janitor


final_df.filter_date("Start_date", start=filtered_date)

一旦你运行import janitor,final_df就会神奇地拥有filter_date可用的方法。


您可以在此处查看更多filter_date示例。


查看完整回答
反对 回复 2022-01-05
  • 1 回答
  • 0 关注
  • 162 浏览
慕课专栏
更多

添加回答

举报

0/150
提交
取消
意见反馈 帮助中心 APP下载
官方微信