按周对数组分组

时间:2020-04-10 21:46:25

标签: arrays pandas dataframe group-by

我有一个包含两列的数据框:datetitlesdate中的值是datetime类型的,在几个月的时间范围内,每一天都有一行。 titles中的值分别类似于['Harry Potter', 'Lord of the Rings', 'Toy Story', ...]等。

我想按星期对数据进行分组。

我尝试过

df_weekly = df.groupby([df.index, pd.Grouper(key='date', freq='W-MON')]).agg({
    'headlines': lambda x: x
})

这不能正常工作;我仍然具有相同的行数,只是date列中的日期已更改为原始日期所在的一周中的最后一天。

如何使它看起来像

date              titles
--------------------------------
2020-01-27        ['title 1', 'title 2', 'title 3', ...] # concatenated arr from all title arrs in that week
2020-02-03        ['title 1', 'title 2', 'title 3', ...]
...

我认为挑战也是试图将title列中的数组视为数组。我尝试从literal_eval插入from ast import literal_eval,但不确定如何实现我需要做的事情。

1 个答案:

答案 0 :(得分:0)

使用resample方法

https://pandas.pydata.org/pandas-docs/stable/reference/api/pandas.DataFrame.resample.html

titles = ['HP', 'TS', 'LOR']
index = pd.date_range('1/1/2020', periods=14, freq='D')
series = pd.Series([titles] * 14, index=index)

所以数据看起来像

2020-01-01    [HP, TS, LOR]
2020-01-02    [HP, TS, LOR]
2020-01-03    [HP, TS, LOR]
2020-01-04    [HP, TS, LOR]
2020-01-05    [HP, TS, LOR]
2020-01-06    [HP, TS, LOR]
2020-01-07    [HP, TS, LOR]
2020-01-08    [HP, TS, LOR]
2020-01-09    [HP, TS, LOR]
2020-01-10    [HP, TS, LOR]
2020-01-11    [HP, TS, LOR]
2020-01-12    [HP, TS, LOR]
2020-01-13    [HP, TS, LOR]
2020-01-14    [HP, TS, LOR]

现在,您可以使用resample来分组一个时间段,这里是一周。 Sum会将您的列表连接在一起。

series.resample('7D').sum()

输出

2020-01-01    [HP, TS, LOR, HP, TS, LOR, HP, TS, LOR, HP, TS...
2020-01-08    [HP, TS, LOR, HP, TS, LOR, HP, TS, LOR, HP, TS...

如果要使用唯一值,请将列表转换为集合

series.resample('7D').sum().apply(lambda x: set(x))