PANDAS中的累积集

时间:2016-09-21 17:02:07

标签: python pandas

我有一个推文数据框,我希望按日期对数据框进行分组,并生成一个列,其中包含截至该日期的所有唯一身份用户的累积列表。现有的功能(例如,cumsum)似乎都不适用于此。以下是原始推文数据框的示例,其中索引(created_at)采用日期时间格式:

In [3]: df
Out[3]: 
            screen_name 
created_at  
04-01-16    Bob 
04-01-16    Bob
04-01-16    Sally
04-01-16    Sally
04-02-16    Bob
04-02-16    Miguel
04-02-16    Tim

我可以按日期折叠数据集并获取每天唯一用户的列:

In [4]: df[['screen_name']].groupby(df.index.date).aggregate(lambda x: set(list(x)))

Out[4]:             from_user_screen_name
        2016-04-02  {Bob, Sally}
        2016-04-03  {Bob, Miguel, Tim}

到目前为止一切顺利。但我想要的是拥有这样的“累积集合”:

Out[4]:             Cumulative_list_up_to_this_date   Cumulative_number_of_unique_users
        2016-04-02  {Bob, Sally}                      2
        2016-04-03  {Bob, Sally, Miguel, Tim}         4

最终,我真正感兴趣的是最后一栏中的累计数字,所以我可以绘制它。我考虑过循环日期和其他事情,但似乎找不到好方法。在此先感谢您的帮助。

1 个答案:

答案 0 :(得分:5)

您无法添加集,但可以添加列表!因此,建立一个用户列表,然后获取累积总和,最后应用集合构造函数来摆脱重复。

cum_names = (df['screen_name'].groupby(df.index.date)
                              .agg(lambda x: list(x))
                              .cumsum()
                              .apply(set))
# 2016-04-01                 {Bob, Sally}
# 2016-04-02    {Bob, Miguel, Tim, Sally}
# dtype: object

cum_count = cum_names.apply(len)
# 2016-04-01    2
# 2016-04-02    4
# dtype: int64