我有一个推文数据框,我希望按日期对数据框进行分组,并生成一个列,其中包含截至该日期的所有唯一身份用户的累积列表。现有的功能(例如,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
最终,我真正感兴趣的是最后一栏中的累计数字,所以我可以绘制它。我考虑过循环日期和其他事情,但似乎找不到好方法。在此先感谢您的帮助。
答案 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