为了账号安全,请及时绑定邮箱和手机立即绑定

在 Pandas 中基于时间戳连续性拆分数据帧

在 Pandas 中基于时间戳连续性拆分数据帧

婷婷同学_ 2021-06-14 04:09:09
我想创建一个新的 DataFrame,其中包含与最后一列中的值 1.0 或 NaN 相对应的行,由此我只采用 1.0 以下的 Nans。但是,我也想考虑 Result 0.0 的行,只要最多有两个这样的时间戳(例如,在下面的简单示例中,我将采用时间戳为 00-00-30 和 00-00 的行-40)。Timestamp  Value         Result    00-00-10   34567          1.0  00-00-20   45425     00-00-30   46773          0.0  00-00-40   64567   00-00-50   25665          1.0  00-01-00   25678  00-01-10   84358 00-01-20   76869          0.000-01-30   95830          00-01-40   87890        00-01-50   99537            00-02-00   85957          1.000-02-10   58840    我把它分成两个数据帧:df_1 = data[((data['Result'].isnull()) & data['Result'].ffill() == 1) | data.Result == 1]和df_2 = data[((data['Result'].isnull()) & data['Result'].ffill() == 0) | data.Result == 0]如何拆分df_2成块,使时间戳连续/不中断?(然后我可以检查每个块是否大于允许的长度,如果不是,则将其附加到df_1并根据时间对其进行排序。)因此,我想要输出:Timestamp  Value         Result    00-00-10   34567          1.0  00-00-20   45425     00-00-30   46773          0.0  00-00-40   64567   00-00-50   25665          1.0  00-01-00   25678  00-01-10   84358 00-02-00   85957          1.000-02-10   58840    
查看完整描述

2 回答

?
慕盖茨4494581

TA贡献1850条经验 获得超11个赞

只做一个mask满足所有三个条件的,然后对原始的进行子集化DataFrame


mask = (

        (df.Result == 1) 

        | (df.Result.ffill() == 1)

        | ((df.Result.ffill() == 0) 

           & (df.groupby((df.Result.ffill() != df.Result.ffill().shift()).cumsum()).Result.transform('size') <= 2))

       )

输出: df[mask]


   Timestamp  Value  Result

0   00-00-10  34567     1.0

1   00-00-20  45425     NaN

2   00-00-30  46773     0.0

3   00-00-40  64567     NaN

4   00-00-50  25665     1.0

5   00-01-00  25678     NaN

6   00-01-10  84358     NaN

11  00-02-00  85957     1.0

12  00-02-10  58840     NaN

说明:你有三个条件

  1. 如果结果 == 1 则保留

  2. 如果它是低于 Result == 1 的 Nan 则保留(已完成.ffill()

  3. 第三个条件决定了连续组的大小,如果是连续组的0大小,我们保留<= 2


查看完整回答
反对 回复 2021-06-15
?
蝴蝶刀刀

TA贡献1801条经验 获得超8个赞

示例数据:


df = pd.DataFrame({'Timestamp': ['00-00-10', '00-00-20', '00-00-30', '00-00-40', 

                   '00-00-50', '00-01-00', '00-01-10', '00-01-20', 

                   '00-01-30', '00-01-40', '00-01-50', '00-02-00', 

                   '00-02-10'],

      'Value': range(0, 13),

      'Result': [1.0, None, 0.0, None, 1.0, None, None, 0.0, None, None, None, 1.0, None]})

代码:


#where NaN after 1

df1 = df.shift(-1)[df.Result == 1] 

#where 1

df2 = df[df.Result==1]

#index where 0 with max Timestamp

ind = df[df.Timestamp == min(df[df.Result == 0].Timestamp)[df.Result==0].index[0]

#select by ind and one next

df3 = df.loc[[ind, ind+1]]

输出:


    Result Timestamp  Value

0      NaN  00-00-20    1.0

4      NaN  00-01-00    5.0

11     NaN  00-02-10   12.0

0      1.0  00-00-10    0.0

4      1.0  00-00-50    4.0

11     1.0  00-02-00   11.0

2      0.0  00-00-30    2.0

3      NaN  00-00-40    3.0

然后,您可以根据需要按索引排序。我希望它有帮助。但我不确定我是否了解您对上次选择的了解。我不明白为什么你的结果是“00-01-10”。


查看完整回答
反对 回复 2021-06-15
  • 2 回答
  • 0 关注
  • 219 浏览
慕课专栏
更多

添加回答

举报

0/150
提交
取消
意见反馈 帮助中心 APP下载
官方微信