Как отфильтровать строки из временного ряда данных по многостолбцовым условиям - PullRequest
0 голосов
/ 02 июля 2019

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

Фрейм данных не является конечными данными, и мне не нужно группировать.Я думаю, что .apply () может помочь получить минимальные данные за один раз.Но я не знаю, как писать код.Кто-нибудь может сказать мне, как это сделать?Заранее большое спасибо.

например, я хотел бы сохранить эти строки:

2018-12-31 09:41:37     22182   T20     30101   error_converter_error_inu_flag  Converter
2018-12-31 11:08:57     22188   T45     30000   error_global_converter  Converter
2018-12-31 11:33:32     22196   T06     30000   error_global_converter  Converter
2018-12-31 13:09:28     22201   T45     30000   error_global_converter  Converter

от нижних строк, потому что они имеют минимальное значение 30000 по сравнению с другими строками в то же время

    alarm_id    unit    code    desc    group_n
time                    
2018-12-31 09:41:37     22182   T20     30101   error_converter_error_inu_flag  Converter
2018-12-31 09:41:37     22183   T20     30102   error_converter_error_inu_voltage   Converter
2018-12-31 11:08:57     22192   T45     30400   error_converter_status  Converter
2018-12-31 11:08:57     22190   T45     30101   error_converter_error_inu_flag  Converter
2018-12-31 11:08:57     22193   T45     30401   error_converter_rdyon   Converter
2018-12-31 11:08:57     22188   T45     30000   error_global_converter  Converter
2018-12-31 11:08:57     22194   T45     30405   error_converter_tripped     Converter
2018-12-31 11:08:57     22191   T45     30102   error_converter_error_inu_voltage   Converter
2018-12-31 11:08:57     22189   T45     30100   error_converter_error_inu   Converter
2018-12-31 11:33:32     22199   T06     30105   error_converter_error_inu_other     Converter
2018-12-31 11:33:32     22197   T06     30100   error_converter_error_inu   Converter
2018-12-31 11:33:32     22198   T06     30101   error_converter_error_inu_flag  Converter
2018-12-31 11:33:32     22196   T06     30000   error_global_converter  Converter
2018-12-31 13:09:28     22201   T45     30000   error_global_converter  Converter
2018-12-31 13:09:28     22207   T45     30405   error_converter_tripped     Converter
2018-12-31 13:09:28     22206   T45     30401   error_converter_rdyon   Converter
2018-12-31 13:09:28     22204   T45     30102   error_converter_error_inu_voltage   Converter
2018-12-31 13:09:28     22203   T45     30101   error_converter_error_inu_flag  Converter
2018-12-31 13:09:28     22205   T45     30400   error_converter_status  Converter
2018-12-31 13:09:28     22202   T45     30100   error_converter_error_inu   Converter

Ответы [ 2 ]

0 голосов
/ 02 июля 2019
import pandas as pd
import numpy as np
df=pd.DataFrame({
    'time':[8,8,8,6,6,6,3,3,3],
    'code':[30,31,32,62,61,63,56,57,55],
    'unit':['T1','T1','T1','T2','T2','T2','T3','T3','T3'],
})
print(df)
print()

def lowfilter(df,c1='time',c2='code'):
    ser=df.groupby(df[c1])[c2].min()
    ser = ser.reset_index()
    df_tmp=pd.DataFrame()
    for idx in ser.index:
        df_tmp = pd.concat([df_tmp,df[(df[c1]==ser.iloc[idx][c1]) & (df[c2]==ser.iloc[idx][c2])]])
    return df_tmp

print(lowfilter(df))

результат:

   time  code unit
0     8    30   T1
1     8    31   T1
2     8    32   T1
3     6    62   T2
4     6    61   T2
5     6    63   T2
6     3    56   T3
7     3    57   T3
8     3    55   T3

   time  code unit
8     3    55   T3
4     6    61   T2
0     8    30   T1

Предыдущий код очень медленный, оптимизация выполнена:

def lowfilter(df,c1='time',c2='code'):
    ser=df.groupby(df[c1])[c2].min()
    ser = ser.reset_index()
    return pd.merge(df,ser)

выводит тот же результат, но в 1000 раз быстрее

0 голосов
/ 02 июля 2019

Когда вы приведете пример воспроизводимого фрейма данных, это будет проще, но в целом df.groupby('time').code.min() делает то, что вам нужно. В случае, если время установлено как индекс, df.groupby(df.index).code.min() должен добиться цели.

...