Pandas: поиск начальных и конечных значений последовательных индексов в кадре данных Pandas - PullRequest
0 голосов
/ 21 марта 2019

У меня есть кадр данных, который выглядит следующим образом ( main_df ):

           value               created_at
0   18.930542  2019-03-04 02:43:08 UTC
1   18.895210  2019-03-04 02:44:09 UTC
2    0.000000  2019-03-04 02:45:09 UTC
3    0.000000  2019-03-04 02:46:10 UTC
4    0.000000  2019-03-04 02:47:11 UTC
5    0.000000  2019-03-04 02:48:12 UTC
6    0.000000  2019-03-04 02:49:13 UTC
7   18.857025  2019-03-04 02:50:14 UTC
8   18.857025  2019-03-04 02:51:14 UTC
9   18.847290  2019-03-04 02:52:15 UTC
10  18.847290  2019-03-04 02:53:17 UTC
11   0.000000  2019-03-04 02:54:17 UTC
12   0.000000  2019-03-04 02:55:19 UTC
13   0.000000  2019-03-04 02:56:19 UTC
14  18.837677  2019-03-04 02:57:20 UTC

Я хочу найти сегменты повторяющихся нулевых значений внутри столбца «значение».Я знаю, как найти нули, просто сделав это:

zeros_df=main_df.loc[main_df['value'] == 0]

Что оставило бы мне следующий фрейм данных ( aux_df1 ): aux_df1

Теперь я хотел бы получить, и у меня нет идеи, как это сохранить только начало и начало каждой последовательной серии индексов в новом фрейме данных с именем aux_df2 и вычислитьразница во времени между началом и концом каждой серии последовательных значений в минутах.Я собираюсь сделать последнюю часть с этим (хотя я хотел бы вычислить разницу только в парах, между каждой парой начало-конец):

aux_df2['t_diff'] = ['temp_index'].diff().astype('timedelta64[m]')

Но в первой части я не знаю, каксделать это.Я ищу, чтобы aux_df2 выглядело так:

aux_df2

Может кто-нибудь помочь мне, пожалуйста?Заранее спасибо.

Редактировать: в ответ на @peer, вот как я генерирую фрейм данных.Обратите внимание, что снимки выше не отражают изменение часового пояса с UTC на EST.

import pandas as pd

filepath=r'C:\Users\myfile.csv'
main_df=pd.read_csv(filepath)
main_df['created_at']=main_df['created_at'].apply(pd.to_datetime)
main_df['created_at'] = main_df['created_at'].dt.tz_localize('UTC').dt.tz_convert('EST')

Ответы [ 2 ]

2 голосов
/ 21 марта 2019

Ваш ожидаемый t_diff, кажется, не является правильным, но вот решение, использующее np.ptp, которое принимает maximum - minimum в диапазоне и pandas.Series.cumsum

Я использовал cumsum, потому что таким образом мы можем найти строки, которые 0

df['cumsum'] = df.value.cumsum()

df['t_diff'] = df.groupby('cumsum').created_at.transform(np.ptp)
df.drop('cumsum', axis=1, inplace=True)

print(df)
    Index      value          created_at   t_diff
0       0  18.930542 2019-03-04 02:43:08 00:00:00
1       1  18.895210 2019-03-04 02:44:09 00:05:04
2       2   0.000000 2019-03-04 02:45:09 00:05:04
3       3   0.000000 2019-03-04 02:46:10 00:05:04
4       4   0.000000 2019-03-04 02:47:11 00:05:04
5       5   0.000000 2019-03-04 02:48:12 00:05:04
6       6   0.000000 2019-03-04 02:49:13 00:05:04
7       7  18.857025 2019-03-04 02:50:14 00:00:00
8       8  18.857025 2019-03-04 02:51:14 00:00:00
9       9  18.847290 2019-03-04 02:52:15 00:00:00
10     10  18.847290 2019-03-04 02:53:17 00:03:02
11     11   0.000000 2019-03-04 02:54:17 00:03:02
12     12   0.000000 2019-03-04 02:55:19 00:03:02
13     13   0.000000 2019-03-04 02:56:19 00:03:02
14     14  18.837677 2019-03-04 02:57:20 00:00:00

note , в этом случае я преобразую, чтобы получить разницу рядом с каждой строкой вгруппа.

1 голос
/ 21 марта 2019

основываясь на информации, которую вы включили, я сделал что-то вроде этого:

import pandas as pd
import numpy as np
df = pd.DataFrame({"index":[2,3,4,5,6,11,12,13],"value": [0,0,0,0,0,0,0,0]})
df["prev_index"] = df["index"].shift(1)
df["next_index"] = df["index"].shift(-1)

df["include"] = df.apply(lambda row: True if np.isnan(row.next_index) or np.isnan(row.prev_index)
         else (True if abs(row["index"]-row.next_index) != 1 
               or abs(row["index"] - row.prev_index) != 1 else False),axis=1)
df[df["include"]][["index","value"]]

Я создал простой фрейм данных из предоставленного вами образца, поэтому моя идея состоит в том, чтобы просто сместить набор данных, чтобы получить предыдущий и следующий индекс, основываясь на обоих столбцах, я просто создал логическое значение, чтобы узнать, является ли индекс одним Я ищу. Надеюсь, это поможет!

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...