gpt4 book ai didi

python - resample/groupby 中的 Pandas 聚合列表

转载 作者:太空宇宙 更新时间:2023-11-03 14:09:53 24 4
gpt4 key购买 nike

我有一个数据框,其中每个实例都有一个时间戳、一个 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 我想按天重新采样(这很容易)并连接所有列表 在同一天发生的实例。重采样 + concat/sum 确实不起作用,因为重新采样会删除所有非数字列(see here)

我想写类似这样的东西:

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 所指出的,这仅适用于 pandas 版本 0.18.1+

  • set_index'timestamp' 为以后的 resample 做准备
  • groupby 'id' 列并选择 lists
  • resample 之后,列表的 sum 将连接它们
  • reset_index 以正确的顺序获取列

df.set_index('timestamp').groupby('id').lists.resample('D').sum() \
.reset_index('id').reset_index()

enter image description here

关于python - resample/groupby 中的 Pandas 聚合列表,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/39462522/

24 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com