Панды группируют столбец с номерами и списками чисел - PullRequest
0 голосов
/ 05 июля 2019

После пересчета некоторых данных у меня есть Dataframe с двумя столбцами. Одним из них является «datetime», другим является сочетание значений float64 и списков значений float64, как показано ниже. Индекс является меткой времени. Я хочу сгруппировать столбец значений по отметке времени, а затем объединить группы. Например, найдите среднее значение для всех чисел с отметкой времени 23:45, то есть чисел в списках.

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

def mash(g):
        print(g)

source = data15[["values"]].groupby("Time").apply(lambda x: mash(x))

Пример данных:

23:45:00 2017-09-24 23:45:00                                           0
23:45:00 2017-01-23 23:45:00                                 2.09229e+08
23:45:00 2017-09-25 23:45:00  [216016810.62, 216100659.19, 216436900.77]
23:45:00 2017-09-26 23:45:00                                 1.23813e+08
23:45:00 2018-11-29 23:45:00                                 2.23831e+07
23:45:00 2017-09-27 23:45:00                                -5.40252e+07
23:45:00 2017-09-28 23:45:00                                  4.5238e+07
23:45:00 2017-09-29 23:45:00              [-119122686.64, -172455686.64]

Обратите внимание, что для этих данных правильным средним значением будет сумма всех значений, деленная на их количество (всего их 11). Один из способов состоит в том, чтобы сгладить каждый список так, чтобы один список становился несколькими новыми строками с одинаковым индексом, и я мог бы использовать 'groupby ("Time"). Mean () ":

23:45:00 2017-09-29 23:45:00              [-119122686.64, -172455686.64]

becomes

23:45:00 2017-09-29 23:45:00              -119122686.64
23:45:00 2017-09-29 23:45:00              -172455686.64

Есть ли способ сделать это?

[решено]: следующее возвращает список для каждого индекса, который имеет нужные мне статистические характеристики.

    def mash(g):
        flat = []
        for i in g.values:
            if type(i[0]) == list:
                [flat.append(j) for j in i[0]]
            else:
                flat.append(i[0])
        mean = np.mean(flat)
        std = np.std(flat)
        per10 = np.percentile(flat, 10)
        per90 = np.percentile(flat, 90)
        return([mean, std, per10, per90])

    source = data15[["values"]].groupby("Time").apply(lambda x: mash(x))

Это дает «источник» в виде строк, где каждая строка содержит список со средним, стандартным значением и т. Д., Например. 06:45:00 [37132,93422085889, 631998,2385994168, 0,0, 0,0]. Интересно то, что то, что передается в .apply (), представляет собой серию массивов массивов, сгруппированных по индексу, то есть массив для группы, содержащей отдельные значения в виде массивов.

1 Ответ

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

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

import numpy as np

data15['new_values'] = data15['values'].apply(lambda x: np.mean(list(x)))
source = data15[['new_values']].groupby('Time').apply(np.sum)

Проблема с примером, который вы привели, заключается в том, что mash ничего не возвращает, поэтому его возвратзначение Нет.И это не может быть агрегировано, так как это не числовое значение.Если вы вернете числовое значение из mash, вы не получите ошибку, которую наблюдаете.

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