首页 > 解决方案 > 熊猫百分比差异计算

问题描述

我有以下 Pandas 数据框。第一列是 YYYY-MM-DD 格式的日期。它有逐月数据,但月份开始可能不一定是第 1 个月,最后一个月可能不一定是 31 或 30,也不一定是 29 或 28,以防 2 月。它可能会有所不同。例如,2020 年 2 月只有 2020 年 2 月 3 日的数据,而 2 月的最后可用数据是 2020 年 2 月 28 日(不是 29 日)。

Date       start_Value end_value
2020-01-01 115         120
2020-01-02 122         125
2020-01-03 125.2       126
...
2020-01-31 132         135
2020-02-03 135.5       137
2020-02-04 137.8       138
...
2020-02-28 144         145   

我的目标是创建一个新列,用于计算数据框中上个月最后一个可用日期的结束值与数据帧中下个月最后一个可用日期的结束值之间的百分比差异。除该月的最后一个可用日期外,所有日期都应为 0。对于 2020 年 1 月,由于我们没有上个月的数据,因此应使用该月第一个可用日期的结束值来计算百分比差异。

对于 2020 年 1 月,将计算 2020 年 1 月 1 日的终值与 2020 年 1 月 31 日的终值之间的百分比差异。对于其余部分(例如从 2020 年 2 月开始:百分比差异是在 2020 年 1 月 31 日的最终值和 2020 年 2 月 28 日的最终值之间计算的)。

Date       start_Value end_value percentage difference
2020-01-01 115         120       0
2020-01-02 122         125       0
2020-01-03 125.2       126       0
...
2020-01-31 132         135       17.4
2020-02-03 135.5       137       0
2020-02-04 137.8       138       0
...
2020-02-28 144         145       7.41       

如何在 python 和 pandas 中实现这一点?

标签: pythonpandasdataframe

解决方案


检查transformduplicated

s = df.Date.dt.strftime('%Y-%m')
df['pct']= (df.groupby(s)['end_value'].transform('last')/df.groupby(s)['start_Value'].transform('first')-1).\
              mask(s.duplicated(keep='last'))

推荐阅读