我有一个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行)时它相对较慢。好奇,如果有更好的解决方案来解决这个问题。
答案 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