我需要帮助旋转我的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
非常感谢!
答案 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