首页 > 解决方案 > 如何从 Pandas DataFrame 中的特定行开始检测过去 2 个月的变化

问题描述

假设我们有一个这样的数据框:

Id  Policy_id   Start_Date  End_Date    Fee1    Fee2    Last_dup
0   b123        2019/02/24  2019/03/23  0       23      0
1   b123        2019/03/24  2019/04/23  0       23      0
2   b123        2019/04/24  2019/05/23  10      23      1
3   c123        2018/09/01  2019/09/30  10      0       0
4   c123        2018/10/01  2019/10/31  10      0       1
5   d123        2017/02/24  2019/03/23  0       0       0
6   d123        2017/03/24  2019/04/23  0       0       1

该列Last_dup是应用.duplicated( answer ) 的结果。

为简化起见,在这种情况下,End_Date和的减法结果Start_Date始终为30天。Fee1我的目标是检测Fee2每个Policy_id.

所以首先,我想找到最后一个元素,Policy_id然后从最后一个元素上升,比较月份之间的费用并检测变化。

预期结果:

Id  Policy_id   Start_Date  End_Date    Fee1    Fee2    Last_dup    Changed
0   b123        2019/02/24  2019/03/23  0       23      0           0
1   b123        2019/03/24  2019/04/23  0       23      0           0
2   b123        2019/04/24  2019/05/23  10      23      1           1
3   c123        2018/09/01  2019/09/30  10      0       0           0
4   c123        2018/10/01  2019/10/31  10      0       1           0
5   d123        2017/02/24  2019/03/23  0       0       0           0
6   d123        2017/03/24  2019/04/23  0       0       1           0

我需要从特定行开始,Last_dup然后1向上比较FeeX. 谢谢!

标签: pythonpandas

解决方案


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

看看下面的例子:

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 janitorfinal_df就会神奇地拥有filter_date可用的方法。

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


推荐阅读