首页 > 解决方案 > 在给定日期仅保留列中第一次出现的数据,而不删除熊猫中的其他出现

问题描述

我对熊猫很陌生,所以请耐心等待。我有几年的 1 分钟间隔明智数据时间框架。每行都有一Long signal列。我的数据框索引是日期时间列。

数据框

为简单起见,我们只取两天的数据。

                        Long Signal
    Date 

2008-01-01 09:55        0
2008-01-01 09:56        1
2008-01-01 09:57        0
...............
2008-01-01 03:28        0
2008-01-01 03:29        1
2008-01-01 03:30        1
2008-01-02 09:55        0
2008-01-02 09:56        0
2008-01-02 09:57        1
...............
2008-01-02 03:28        0
2008-01-02 03:29        1
2008-01-02 03:30        1

我正在尝试将其转换为数据框,如下所示,

                       Long Signal
    Date 

2008-01-01 09:55        0
2008-01-01 09:56        1
2008-01-01 09:57        0
...............
2008-01-01 03:28        0
2008-01-01 03:29        0
2008-01-01 03:30        0
2008-01-02 09:55        0
2008-01-02 09:56        0
2008-01-02 09:57        1
...............
2008-01-02 03:28        0
2008-01-02 03:29        0
2008-01-02 03:30        0

那就是我只想保留第一次出现Long signal并在同一天的剩余出现中填充 0。那是因为在任何给定的一天Long signal最多只会出现一次值 1。尝试过drop_duplicate但没有运气。我将不胜感激任何帮助。

编辑 1:

我想保留第一个Long signal为 1 的时间信息。在我的情况下,它是这一天和2008-01-01它是。换句话说,我希望我的数据本身在 1 分钟的时间间隔内,同时仅在.09:56 2008-01-0209:571Long signal

标签: pythonpandas

解决方案


要仅保留第一次出现Long Signal并用 0 填充其余的,您可以使用locgroupbywithdt.day和的组合idxmax()

idxmax()函数用于获取最大值的行标签,如果多个值等于最大值(即在您的情况下为 1),则返回具有该值的第一个行标签,因此非常适合您的需求。

为了显示:

df['Long Signal'] = df['Long Signal'].loc[df.groupby([df.Date.dt.day])['Long Signal'].idxmax()]
df['Long Signal'].fillna(0,inplace=True)

会回来:

Out[134]: 

                  Date  Long Signal
0  2008-01-01 09:55:00          0.0
1  2008-01-01 09:56:00          1.0
2  2008-01-01 09:57:00          0.0
3  2008-01-01 03:28:00          0.0
4  2008-01-01 03:29:00          0.0
5  2008-01-01 03:30:00          0.0
6  2008-01-02 09:55:00          0.0
7  2008-01-02 09:56:00          0.0
8  2008-01-02 09:57:00          1.0
9  2008-01-02 03:28:00          0.0
10 2008-01-02 03:29:00          0.0
11 2008-01-02 03:30:00          0.0

要保留第一个 Long 信号为 1 的时间信息,您可以简单地使用:

df.loc[df['Long Signal']==1]['Date']

1   2008-01-01 09:56:00
8   2008-01-02 09:57:00

但我不能 100% 确定这是您第二部分所需要的,因为它没有在您想要的输出中展示。


推荐阅读