Pandas 数据框 - 使用开始和结束对重塑列

MBl*_*eld 4 python pivot dataframe pandas

我一直在试图找出一种方法来转换这个数据框。它只包含两列;一种是时间序列数据,另一种是事件标记。这是初始数据帧的示例:

df1 = pd.DataFrame({'Time': ['1:42 AM','2:30 AM','3:29 AM','4:19 AM','4:37 AM','4:59 AM','5:25 AM','5:33 AM','6:48 AM'], 
                    'Event': ['End','Start','End','Start','End','Start','Start','End','Start']})
Run Code Online (Sandbox Code Playgroud)

这就是我希望转换后的样子:

df2 = pd.DataFrame({'Start': ['', '2:30 AM', '4:19 AM', '4:59 AM', '5:25 AM', '6:48 AM'],
                    'End': ['1:42 AM', '3:29 AM', '4:37 AM', '', '5:33 AM', '']})
Run Code Online (Sandbox Code Playgroud)

本质上,我想将事件标记为新列,并在事件发生时将开始时间和结束时间在表格中配对。

此示例包括有时会发生的两种异常:

  1. 第一行数据是“结束”标记(数据按日期截断)。
  2. 有时,特定“开始”标记不会有“结束”标记(作业失败或在报告运行时未完成)。

我查看了pivotpivot_table但无法添加获得我想要的输出的索引。很确定这应该是可能的,我只是还不是数据帧方面的专家。

And*_*ely 5

尝试:

df1["tmp"] = df1["Event"].eq("Start").cumsum()
df1 = df1.pivot(index="tmp", columns="Event", values="Time").fillna("")
df1.columns.name, df1.index.name = None, None

print(df1[["Start", "End"]])
Run Code Online (Sandbox Code Playgroud)

印刷:

     Start      End
0           1:42 AM
1  2:30 AM  3:29 AM
2  4:19 AM  4:37 AM
3  4:59 AM         
4  5:25 AM  5:33 AM
5  6:48 AM         
Run Code Online (Sandbox Code Playgroud)