我有一个包含测试数据的大型 Dataframe (1m+行)。在不同时间拍摄了"事件"的快照,每个快照最多向 Dataframe 添加三行。例如,在以下摘录中,事件At223的第一个快照拍摄于2016年3月18日18:10:45,第二个快照拍摄于2016年3月21日10:14:28,等等。
我想过滤 Dataframe ,以便它只返回每个参考的最后n个快照。参考是唯一的,而事件可以重复。
我是Pandas的新手,但尝试过sort_values,groupby和tail的各种组合,但都不能得到想要的结果。
df = df.sort_values(['Ref', 'Time']).groupby(['Time', 'Ref', 'TestId']).tail(3)
有谁能建议一下怎么做吗?在下面的结果示例中,n = 3,所以它显示了每个参考的最后三个快照。
提取物:
| 时间|参考|事件|结束时间|测试ID|测试名称|结果|
| - ------|- ------|- ------|- ------|- ------|- ------|- ------|
| 2016年3月18日18时10分45秒|一、一二三七一七九八五|阿223|2016年1月4日16:00|小行星28212|一个||
| 2016年3月18日18时10分45秒|一、一二三七一七九八五|阿223|2016年1月4日16:00|小行星466299|两个||
| 2016年3月18日18时10分45秒|一、一二三七一七九八五|阿223|2016年1月4日16:00|小行星588|三个||
| 2016年3月21日10时14分28秒|一、一二三七一七九八五|阿223|2016年1月4日16:00|小行星28212|一个||
| 2016年3月21日10时14分28秒|一、一二三七一七九八五|阿223|2016年1月4日16:00|小行星466299|两个|四个|
| 2016年3月21日10时14分28秒|一、一二三七一七九八五|阿223|2016年1月4日16:00|小行星588|三个||
| 2016年3月21日12时44分34秒|一、一二三七一七九八五|阿223|2016年1月4日16:00|小行星28212|一个||
| 2016年3月21日12时44分34秒|一、一二三七一七九八五|阿223|2016年1月4日16:00|小行星466299|两个|四、五|
| 2016年3月21日12时44分34秒|一、一二三七一七九八五|阿223|2016年1月4日16:00|小行星588|三个||
| 2016年3月21日13时05分16秒|一、一二三七一七九八五|阿223|2016年1月4日16:00|小行星28212|一个||
| 2016年3月21日13时05分16秒|一、一二三七一七九八五|阿223|2016年1月4日16:00|小行星466299|两个|四、五|
| 2016年3月21日13时05分16秒|一、一二三七一七九八五|阿223|2016年1月4日16:00|小行星588|三个||
| 2016年3月21日13时14分22秒|一、一二三七一七九八五|阿223|2016年1月4日16:00|小行星28212|一个||
| 2016年3月21日13时14分22秒|一、一二三七一七九八五|阿223|2016年1月4日16:00|小行星466299|两个|四、五|
| 2016年3月21日13时14分22秒|一、一二三七一七九八五|阿223|2016年1月4日16:00|小行星588|三个||
| 2016年4月1日10:37:43|一、一二三七一七九八五|阿223|2016年1月4日16:00|小行星28212|一个||
| 2016年4月1日10:37:43|一、一二三七一七九八五|阿223|2016年1月4日16:00|小行星466299|两个|四、五|
| 2016年4月1日10:37:43|一、一二三七一七九八五|阿223|2016年1月4日16:00|小行星588|三个||
| 2016年3月18日18时12分12秒|一、一二三七一九五一二|溴十二烷|2016年3月4日16:00|小行星28|八个|七|
| 2016年3月18日18时12分12秒|一、一二三七一九五一二|溴十二烷|2016年3月4日16:00|小行星1212772|九|一点五八|
| 2016年3月18日18时12分12秒|一、一二三七一九五一二|溴十二烷|2016年3月4日16:00|小行星588|十个|四、四|
| 2016年3月21日13时03分48秒|一、一二三七一九五一二|溴十二烷|2016年3月4日16:00|小行星28|八个|七、二|
| 2016年3月21日13时03分48秒|一、一二三七一九五一二|溴十二烷|2016年3月4日16:00|小行星1212772|九|一点五八|
| 2016年3月21日13时03分48秒|一、一二三七一九五一二|溴十二烷|2016年3月4日16:00|小行星588|十个|四、四|
| 2016年3月21日13时19分15秒|一、一二三七一九五一二|溴十二烷|2016年3月4日16:00|小行星28|八个|七、二|
| 2016年3月21日13时19分15秒|一、一二三七一九五一二|溴十二烷|2016年3月4日16:00|小行星1212772|九|一点五八|
| 2016年3月21日13时19分15秒|一、一二三七一九五一二|溴十二烷|2016年3月4日16:00|小行星588|十个|四、五|
| 2016年4月1日12:48:13|一、一二三七一九五一二|溴十二烷|2016年3月4日16:00|小行星28|八个|七、二|
| 2016年4月1日12:48:13|一、一二三七一九五一二|溴十二烷|2016年3月4日16:00|小行星1212772|九|一点五九|
| 2016年4月1日12:48:13|一、一二三七一九五一二|溴十二烷|2016年3月4日16:00|小行星588|十个|四、五|
预期结果:
| 时间|参考|事件|结束时间|测试ID|测试名称|结果|
| - ------|- ------|- ------|- ------|- ------|- ------|- ------|
| 2016年3月21日13时05分16秒|一、一二三七一七九八五|阿223|2016年1月4日16:00|小行星28212|一个||
| 2016年3月21日13时05分16秒|一、一二三七一七九八五|阿223|2016年1月4日16:00|小行星466299|两个|四、五|
| 2016年3月21日13时05分16秒|一、一二三七一七九八五|阿223|2016年1月4日16:00|小行星588|三个||
| 2016年3月21日13时14分22秒|一、一二三七一七九八五|阿223|2016年1月4日16:00|小行星28212|一个||
| 2016年3月21日13时14分22秒|一、一二三七一七九八五|阿223|2016年1月4日16:00|小行星466299|两个|四、五|
| 2016年3月21日13时14分22秒|一、一二三七一七九八五|阿223|2016年1月4日16:00|小行星588|三个||
| 2016年4月1日10:37:43|一、一二三七一七九八五|阿223|2016年1月4日16:00|小行星28212|一个||
| 2016年4月1日10:37:43|一、一二三七一七九八五|阿223|2016年1月4日16:00|小行星466299|两个|四、五|
| 2016年4月1日10:37:43|一、一二三七一七九八五|阿223|2016年1月4日16:00|小行星588|三个||
| 2016年3月21日13时03分48秒|一、一二三七一九五一二|溴十二烷|2016年3月4日16:00|小行星28|八个|七、二|
| 2016年3月21日13时03分48秒|一、一二三七一九五一二|溴十二烷|2016年3月4日16:00|小行星1212772|九|一点五八|
| 2016年3月21日13时03分48秒|一、一二三七一九五一二|溴十二烷|2016年3月4日16:00|小行星588|十个|四、四|
| 2016年3月21日13时19分15秒|一、一二三七一九五一二|溴十二烷|2016年3月4日16:00|小行星28|八个|七、二|
| 2016年3月21日13时19分15秒|一、一二三七一九五一二|溴十二烷|2016年3月4日16:00|小行星1212772|九|一点五八|
| 2016年3月21日13时19分15秒|一、一二三七一九五一二|溴十二烷|2016年3月4日16:00|小行星588|十个|四、五|
| 2016年4月1日12:48:13|一、一二三七一九五一二|溴十二烷|2016年3月4日16:00|小行星28|八个|七、二|
| 2016年4月1日12:48:13|一、一二三七一九五一二|溴十二烷|2016年3月4日16:00|小行星1212772|九|一点五九|
| 2016年4月1日12:48:13|一、一二三七一九五一二|溴十二烷|2016年3月4日16:00|小行星588|十个|四、五|
3条答案
按热度按时间j2qf4p5b1#
你可以循环遍历每一个唯一的事件,并从每个事件中获取前n个事件,然后将结果连接在一起:
xytpbqjk2#
分解日期并保留n个最高值(假设您的 Dataframe 已按时间排序)
输出:
gorkyyrv3#
可以在
groupby
之后使用apply
并创建一个函数,仅处理具有单个
Ref
的 Dataframe