python - 如何从 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
. 谢谢!
解决方案
我认为为每个策略添加一个“交易编号列”将使这更容易。然后,您可以对事务进行重复数据删除,以查看是否有“更改”的行。
看看下面的例子:
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
示例。
推荐阅读
- azure - 在 Lookup @ Azure Data Factory 中处理 >5000 行
- php - 查询从 bd 检索数据后,utf8 在 php 中不起作用?
- java - 井字游戏预测平局(平局)
- python-3.x - 如何从 groupby 数据框中读取特定行?
- javascript - 如何以开玩笑的方式测试服务调用
- laravel - 使用关系检索数据
- wxpython - wxPython 多个绘制函数
- android - 约束布局,视图被推到边界之外
- php - 验证错误 {"ErrorCode":"invalid_client","Error":"需要客户端标识符"}
- reactjs - 为什么我的登录不允许通过我的 React ASP.NET Core 应用程序中的 API 获取数据?