熊猫按数字和数字列表分组

时间:2019-07-04 21:28:52

标签: python-3.x pandas-groupby

重新采样一些数据后,我有一个包含两列的数据框。一个是“ 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()'的是按索引分组的一系列数组数组,即包含各个值作为数组的组的数组。

1 个答案:

答案 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返回一个数值,则不会得到所观察到的错误。