Установите значение столбца в каждой первой совпадающей строке равным 0 - PullRequest
1 голос
/ 30 января 2020

Я пытаюсь обнаружить последовательности времени, где разница между временными метками ниже некоторого порога. Для этого я преобразую список временных меток в секунды и измеряю разницу между каждой временной меткой. Я написал код для этого, но проблема в том, что когда я измеряю разницу между днями, значение разницы во времени должно быть равно нулю для первой строки каждого дня. Таким образом, значение 86390 в нижнем фрейме данных должно быть 0. Это просто надуманный пример. Для нескольких групп, как установить первую запись в каждой группе на 0?

Код:

import pandas as pd

arr= []
df = pd.DataFrame(
    {'date': ['2019-01-01 00:02:48.714000' , '2019-01-01 00:02:58.714000' , '2019-01-02 00:02:48.714000' , '2019-01-02 00:04:48.714000'],
     'id': [1 , 2 , 3 , 4],

    })
df['date'] = pd.to_datetime(df['date'])

for d in df['date'] : 
    arr.append(d.timestamp())

df.sort_values(by=['date'])
df['TIME_IN_SEC'] = arr
df['TIME_IN_SEC_SHIFT'] = df.TIME_IN_SEC.shift(1)
df['TIME_DIFF'] = df["TIME_IN_SEC"] - df["TIME_IN_SEC_SHIFT"]

list_values = []

for g in df.groupby(pd.Grouper(key='date',freq='D')) : 
    list_values.append(sum(g[1]['TIME_DIFF']) / len(g[1]))

df

рендеринга:

enter image description here

1 Ответ

1 голос
/ 30 января 2020

Чтобы установить в первой строке каждого дня ноль, вы можете сгруппировать по столбцу даты, но извлечь фактическое значение даты, а затем агрегировать в «первую» строку. Создайте серию из этого для столбца 'id'. (Я предполагаю, что они являются уникальными значениями.)

id_filt = df.groupby(df.date.dt.date).first()['id']

Затем используйте lo c, чтобы вернуть только строки со значениями 'id', затем установите столбцы равными нулю.

df.loc[df["id"].isin(id_filt.values), ["TIME_IN_SEC_SHIFT", "TIME_DIFF"]] = 0

                     date  id   TIME_IN_SEC  TIME_IN_SEC_SHIFT  TIME_DIFF
0 2019-01-01 00:02:48.714   1  1.546301e+09       0.000000e+00        0.0
1 2019-01-01 00:02:58.714   2  1.546301e+09       1.546301e+09       10.0
2 2019-01-02 00:02:48.714   3  1.546387e+09       0.000000e+00        0.0
3 2019-01-02 00:04:48.714   4  1.546387e+09       1.546387e+09      120.0

Конечно, вы можете объединить их вместе, чтобы получить:

df.loc[
    df["id"].isin(df.groupby(df.date.dt.date).first()["id"].values),
    ["TIME_IN_SEC_SHIFT", "TIME_DIFF"],
] = 0
...