计算最近一次状态的发生-熊猫

时间:2019-02-26 20:36:11

标签: pandas

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

我有一个约有15万行的小型数据集,其中有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周的最后两周,{{ 1}}和4

目前,我的方法是按5df对我的ID进行排序,然后Week来获得上和下的最后一次出现并求和几周。

我感到有点傻,因为我确定这是一个简单的问题。.

目标数据集

groupby.tail()

原始DataFrame:

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

1 个答案:

答案 0 :(得分:1)

下面的代码分两个步骤进行操作:

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]}})

产生此输出:

enter image description here

编辑:也许更简单:

仅获取“ over”的最后两次出现并对其进行处理。

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]}})