Pandas按年度分组的唯一身份用户数

时间:2016-01-12 15:26:18

标签: python python-3.x pandas

我有一个report_date列,我希望按其年周汇总,并计算唯一身份用户的数量。

import pandas as pd
from io import StringIO

datastring = StringIO("""\
report_date  user_id
2015-12-01         1
2015-12-01         2
2015-12-01         2
2015-12-02         2
2015-12-02         3
2016-01-01         1
""")

df = pd.read_table(datastring, sep='\s\s+', engine='python')
df['report_date'] = pd.to_datetime(df['report_date'])

我想要的输出:

2015-48    3
2016-00    1

我提出了一个解决方案(在下面发布)但是当使用更大的数据集(> 1MM行)时它相对较慢。好奇,如果有更好的解决方案来解决这个问题。

2 个答案:

答案 0 :(得分:1)

(df.assign(report_week=lambda x: x.report_date.dt.strftime('%Y-%W'))
  .groupby('report_week')
  .user_id
  .nunique()
)

修改

我最终修改了@ EdChum的建议,以摆脱像2016-53'当report_date为2016-01-01时,按周数模53进行分组:

df.groupby([df.report_date.dt.year, df.report_date.dt.week.mod(53)]).user_id.nunique()

答案 1 :(得分:1)

由于您的列已经是日期时间,因此无需在字符串上转换为字符串和groupby,我们可以对year and week组件进行分组,然后只需调用nunique

In [108]:
df.groupby([df['report_date'].dt.year, df['report_date'].dt.week])['user_id'].nunique()

Out[108]:
report_date  report_date
2015         49             3
2016         53             1
Name: user_id, dtype: int64