大熊猫转动开始和结束

时间:2018-01-19 16:57:58

标签: pandas pivot

我需要帮助旋转我的df以获得开始和结束日。

Id  Day   Value
111 6     a
111 5     a
111 4     a 
111 2     a
111 1     a
222 3     a
222 2     a
222 1     a
333 1     a

期望的结果是:

Id  StartDay  EndDay
111 4         6
111 1         2       (since 111 skips day 3)
222 1         3
333 1         1

非常感谢!

1 个答案:

答案 0 :(得分:1)

所以,我的第一个念头就是:

df.groupby('Id').Day.agg(['min','max'])

但后来我注意到你的规定“(因为111跳过第3天)”,这意味着我们必须制作一个标识符,告诉我们当前行是否与前一行相同'块'(相同的Id,连续日) )。所以,我们排序:

df.sort_values(['Id','Day'], inplace=True)

然后定义块:

df['block'] = ((df.Day!=(df.shift(1).Day+1).fillna(0).astype(int))).astype(int).cumsum()

(改编自这个问题的最佳答案:Finding consecutive segments in a pandas data frame

然后按ID和阻止分组:

df.groupby(['Id','block']).Day.agg(['min','max'])

,并提供:

Id  block   min max
111 1       1   2
111 2       4   6
222 3       1   3
333 4       1   1
相关问题