После пересчета некоторых данных у меня есть 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 (), представляет собой серию массивов массивов, сгруппированных по индексу, то есть массив для группы, содержащей отдельные значения в виде массивов.