重新采样一些数据后,我有一个包含两列的数据框。一个是“ 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))
以行的形式产生“源”,其中每一行包含一个带有均值,std等的列表。 06:45:00 [37132.93422085889,631998.2385994168,0.0,0.0]。有趣的是,传递给'.apply()'的是按索引分组的一系列数组数组,即包含各个值作为数组的组的数组。
答案 0 :(得分:0)
首先将您的value列标准化为相同的数据类型,然后进行汇总将更容易。
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
不返回任何内容,因此其返回值为None。由于它不是数值,因此无法汇总。如果您从mash
返回一个数值,则不会得到所观察到的错误。