首页 > 解决方案 > 计算最近出现的状态 - Pandas

问题描述

对于以下问题,我有一种不优雅的解决方案,我想知道是否有更好的方法来处理以下类型的数据集,

我有一个大约 150k 行的小数据集,其中有 3 个基本行,我正在尝试解决:

ID  Status Week
1   base   1
1   over   2
1   base   3
1   over   4
1   over   5
1   under  6

计算 的最终出现次数的最有效方法是over什么?

本质上,对于上面的数据集,我会说ID == 1Status over 从一周开始,4总共持续了两周,4并且5.

df我目前的方法是按IDand对我的排序Week,然后groupby.tail()获取最后出现的 over 和 under 并总结周的差异。

我觉得有点傻,因为我确定这是一个简单的问题..!

目标数据集

ID Duration of Last-Over, Start-Week, End-Week  
1, 2,                     4,           5  

原始数据框:

ID, Budget, Spend, Week, Status
1,  50,     50,    1,    base
1   50,     55,    2,    over
1   50,     50,    3,    base
1   50,     250,   4,    over
1   50,     300,   5,    over
1   50,     42,    6,    under. 

标签: pandas

解决方案


下面的代码分两步完成:

last = df[df.Status == 'over'][::-1][0:1].index
before_last = df[df.Status == 'over'][::-1][1:2].index
diff = df.iloc[last,3].values - df.iloc[before_last,3].values +1
ID = df.iloc[last,0]

new_df = pd.DataFrame({'ID': {0: ID.values[0]}, 
                       'Duration of Last-Over':  {0: diff[0]}, 
                       'Start-Week':  {0: df.iloc[before_last]['Week'].values[0]}, 
                       'End-Week':  {0: df.iloc[last]['Week'].values[0]}})

产生这个输出:

在此处输入图像描述

编辑:也许是一个更简单的答案:

仅获取最后两次出现的“过度”并对其进行操作。

df_aux = df[df.Status == 'over'].tail(2)
new_df = pd.DataFrame({'ID': {0: df_aux.iloc[1,0]}, 
                       'Duration of Last-Over':  {0: df_aux.iloc[1,3] - df_aux.iloc[0,3] +1}, 
                       'Start-Week':  {0: df_aux.iloc[0,3]}, 
                       'End-Week':  {0: df_aux.iloc[1,3]}})

推荐阅读