Усреднение последних нескольких записей каждого уникального значения в столбце для генерации нового df - PullRequest
0 голосов
/ 25 января 2019

У меня df.head() моего фрейма данных выглядит следующим образом. Я измеряю свои данные где-то между частотой 7 и 9 Гц, и у меня есть около 100 уникальных значений Psnr. Если я хочу создать новый фрейм данных с одной точкой, представляющей усредненное значение за последние пять минут каждого уникального Psnr, каков наилучший способ сделать это?

Datum_Zeit  Psnr
2018-10-04 14:43:11.410 2
2018-10-04 14:43:11.600 2
2018-10-04 14:43:11.790 2
2018-10-04 14:43:11.970 2
2018-10-04 14:43:12.160 2

Возможный способ сделать это - создать фреймы под-данных, отфильтровать и снова объединить их, как показано ниже. Но я уверен, что должно быть более простое решение

dfs = {k: df[df['Psnr'] == k] for k in df['Psnr'].unique()}

Ответы [ 2 ]

0 голосов
/ 25 января 2019

Поскольку ваш фрейм данных уже отсортирован по времени, вы можете вычислить ряд min_time, выровненный по индексу фрейма данных, с помощью transform + last, затем отфильтровать и, наконец, groupby:

min_times = df.groupby('Psnr')['Datum_Zeit'].transform('last') - pd.Timedelta('5 min')

res = df.loc[df['Datum_Zeit'] > min_times]\
        .groupby('Psnr').mean().reset_index()

print(res)

   Psnr  Speed  Torque
0     2    5.5    1.25
1     3    7.0    2.00
0 голосов
/ 25 января 2019

Я считаю, что вам нужно сначала отфильтровать данные за последние 5 минут для каждой группы, а затем агрегировать mean по столбцу Psnr:

print (df)
                Datum_Zeit  Psnr  Speed  Torque
0  2018-10-04 14:38:11.410     2      8       6
1  2018-10-04 14:39:11.600     2      7       0
2  2018-10-04 14:40:11.790     2      1       1
3  2018-10-04 14:41:11.970     2      9       3
4  2018-10-04 14:43:12.160     2      5       1
5  2018-10-04 14:39:11.600     3      7       0
6  2018-10-04 14:40:11.790     3      1       1
7  2018-10-04 14:44:11.970     3      9       3
8  2018-10-04 14:45:12.160     3      5       1

df['Datum_Zeit'] = pd.to_datetime(df['Datum_Zeit'])

s = df.groupby('Psnr')['Datum_Zeit'].transform('max')
df = df[df['Datum_Zeit'].between(s - pd.Timedelta(300, 's'), s)]
print (df)
               Datum_Zeit  Psnr  Speed  Torque
1 2018-10-04 14:39:11.600     2      7       0
2 2018-10-04 14:40:11.790     2      1       1
3 2018-10-04 14:41:11.970     2      9       3
4 2018-10-04 14:43:12.160     2      5       1
7 2018-10-04 14:44:11.970     3      9       3
8 2018-10-04 14:45:12.160     3      5       1

Если необходимо среднее значение для всех столбцов без datetime:

df = df.groupby('Psnr').mean()
print (df)
      Speed  Torque
Psnr               
2       5.5    1.25
3       7.0    2.00

Если нужен только столбец даты и времени:

df['dates']= df['Datum_Zeit'].astype(np.int64)
df1 = pd.to_datetime(df.groupby('Psnr')['dates'].mean()).reset_index()
print (df1)
   Psnr                         dates
0     2 2018-10-04 14:40:56.880000000
1     3 2018-10-04 14:44:42.064999936
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...