pandas 如何在panda Dataframe 中只返回连续值

bmp9r5qi  于 2023-03-06  发布在  其他
关注(0)|答案(1)|浏览(101)

我修改了一个 Dataframe ,使其仅包含超过特定值的行。现在,在此新 Dataframe 中,我希望进一步修改它,使其仅包含连续的行。例如,如果此 Dataframe 具有索引,然后是时间戳和值标头:

Timestamp     Value
316 2022-03-01T16:28:50.4580078Z    36.000
344 2022-03-01T17:26:25.8170166Z    37.500
345 2022-03-01T17:26:45.8480072Z    41.000
346 2022-03-01T17:27:05.8800048Z    35.250
374 2022-03-01T18:23:10.9630126Z    36.000
387 2022-03-01T18:36:12.1380004Z    42.000
388 2022-03-01T18:36:32.1690063Z    37.000
391 2022-03-01T18:37:52.2950134Z    34.500

这应该返回一个只有344、345、346、387和388的新 Dataframe ,因为只有这些行在索引中有连续的相邻行

Timestamp     Value
344 2022-03-01T17:26:25.8170166Z    37.500
345 2022-03-01T17:26:45.8480072Z    41.000
346 2022-03-01T17:27:05.8800048Z    35.250
387 2022-03-01T18:36:12.1380004Z    42.000
388 2022-03-01T18:36:32.1690063Z    37.000

我尝试过使用df.iloc[i]df.iloc[i-1]迭代并追加到一个新列表,但似乎仍然无法使其正常工作。

osh3o9ms

osh3o9ms1#

基于时间

您可以计算连续的时间差,并将它们与阈值(此处为1分钟)进行比较。保留掩码为True的行(或下面的行):

thresh = '1min'

m = (pd.to_datetime(df['Timestamp'])
       .diff().lt(thresh)
    )

out = df[m|m.shift(-1)]
基于索引

逻辑相同,但检查索引中连续的1差。

m = df.index.to_series().diff().eq(1)

out = df[m|m.shift(-1)]

输出:

Timestamp  Value
344 2022-03-01 17:26:25.817016600+00:00  37.50
345 2022-03-01 17:26:45.848007200+00:00  41.00
346 2022-03-01 17:27:05.880004800+00:00  35.25
387 2022-03-01 18:36:12.138000400+00:00  42.00
388 2022-03-01 18:36:32.169006300+00:00  37.00

中间体:

Timestamp  Value      m m.shift(-1)
316 2022-03-01 16:28:50.458007800+00:00  36.00  False       False
344 2022-03-01 17:26:25.817016600+00:00  37.50  False        True
345 2022-03-01 17:26:45.848007200+00:00  41.00   True        True
346 2022-03-01 17:27:05.880004800+00:00  35.25   True       False
374 2022-03-01 18:23:10.963012600+00:00  36.00  False       False
387 2022-03-01 18:36:12.138000400+00:00  42.00  False        True
388 2022-03-01 18:36:32.169006300+00:00  37.00   True       False
391 2022-03-01 18:37:52.295013400+00:00  34.50  False         NaN

相关问题