Python 重新采样/分组方式中的聚合列表

Python 重新采样/分组方式中的聚合列表,python,pandas,dataframe,group-by,pandas-groupby,Python,Pandas,Dataframe,Group By,Pandas Groupby,我有一个数据帧,其中每个实例都有一个时间戳、一个id和一个数字列表,如下所示: timestamp | id | lists ---------------------------------- 2016-01-01 00:00:00 | 1 | [2, 10] 2016-01-01 05:00:00 | 1 | [9, 10, 3, 5] 2016-01-01 10:00:00 | 1 | [1, 10, 5] 2016-01-02 01:00:00 | 1 | [

我有一个数据帧,其中每个实例都有一个时间戳、一个id和一个数字列表,如下所示:

timestamp           | id | lists
----------------------------------
2016-01-01 00:00:00 | 1  | [2, 10]
2016-01-01 05:00:00 | 1  | [9, 10, 3, 5]
2016-01-01 10:00:00 | 1  | [1, 10, 5]
2016-01-02 01:00:00 | 1  | [2, 6, 7]
2016-01-02 04:00:00 | 1  | [2, 6]
2016-01-01 02:00:00 | 2  | [0]
2016-01-01 08:00:00 | 2  | [10, 3, 2]
2016-01-01 14:00:00 | 2  | [0, 9, 3]
2016-01-02 03:00:00 | 2  | [0, 9, 2]
对于每个id,我想按天重新采样(这很容易),并连接所有 同一天发生的实例的列表。重采样+浓度/总和 不起作用,因为重采样将删除所有非数字列()

我想写一些类似的东西:

daily_data = data.groupby('id').resample('1D').concatenate() # .concatenate() does not exist
期望的结果:

timestamp  | id | lists
----------------------------------
2016-01-01 | 1  | [2, 10, 9, 10, 3, 5, 1, 10, 5]
2016-01-02 | 1  | [2, 6, 7, 2, 6]
2016-01-01 | 2  | [0, 10, 3, 2]
2016-01-02 | 2  | [0, 9, 3, 0, 9, 2]
在这里,您可以复制生成我用于描述的输入的脚本:

import pandas as pd 
from random import randint

time = pd.to_datetime( ['2016-01-01 00:00:00', '2016-01-01 05:00:00', 
                        '2016-01-01 10:00:00', '2016-01-02 01:00:00', 
                        '2016-01-02 04:00:00', '2016-01-01 02:00:00', 
                        '2016-01-01 08:00:00', '2016-01-01 14:00:00',
                        '2016-01-02 03:00:00' ]
                      )

id_1 = [1] * 5
id_2 = [2] * 4

lists = [0] * 9
for i in range(9):
    l = [randint(0,10)  for _ in range(randint(1,5) ) ]
    l = list(set(l))
    lists[i] = l

data = {'timestamp': time, 'id': id_1 + id_2, 'lists': lists}

example = pd.DataFrame(data=data)

如果有一种方法可以选择性地删除串联列表中的重复项,则可获得额外积分。

正如@jezrael所指出的,这只适用于熊猫版本0.18.1+

  • 使用
    'timestamp'
    设置索引
    ,为以后的
    重新采样做准备
  • groupby
    'id'
    列,然后选择
    列表
  • 重采样
    之后,列表的
    将它们连接起来
  • reset_index
    以正确顺序获取列


对于每个列表项的唯一计数,请使用列表理解:

a = [list(set(l)) for l in df.lists]
df.loc[:,'lists'] = a

这解决了我的问题!我使用了相同的代码,但没有指定列名“lists”,它只返回时间戳和id。谢谢:-)
a = [list(set(l)) for l in df.lists]
df.loc[:,'lists'] = a