我希望能够按用户然后按特定日期段对数据进行分组-获取计数和平均值,并在每个日期段的新列中创建它们。
我的数据如下:
df = pd.DataFrame({
"USER_ID": ["AA1", "AB1", "AA3", "CD3", "AB4", "AA1", "AA1", "AA3", "AB4", "AB4"],
"ACTIVITY_CATEGORY": [1, 2, 3, 4, 5, 6, 7, 8, 9, 10],
"DATE": ['2018-09-19', '2018-09-13', '2018-09-06', '2018-09-18', '2018-09-15', '2018-09-19', '2018-09-16', '2018-09-06', '2018-09-04', '2018-09-04']})
因此,我通常按以下步骤进行操作:
df.groupby(['USER_ID',pd.Grouper(key='DATE', freq='W')])['ACTIVITY_CATEGORY'].count()
但是我现在想要的是能够在特定星期内拿到它。本质上可以得到更多类似的东西:
我已经阅读了有关在Grouper中分组的不同方式的文档-以及可以使用的偏移量。仍然找不到这样的东西。
使用for循环并使用timedelta并从最近的日期减去7天有一种相当繁琐的方法-但是在大型数据集上效率极低。寻找更Python化的方式。
答案 0 :(得分:1)
这与您要实现的目标类似
df['DATE'] = 'WEEK ' + pd.to_numeric(pd.to_datetime(df['DATE']).dt.day/7).apply(math.ceil).apply(str)
df.pivot_table(index=['USER_ID'],columns=['DATE'],aggfunc='count').fillna(0)
出局:
ACTIVITY_CATEGORY
DATE WEEK 1 WEEK 2 WEEK 3
USER_ID
AA1 0.0 0.0 3.0
AA3 2.0 0.0 0.0
AB1 0.0 1.0 0.0
AB4 2.0 0.0 1.0
CD3 0.0 0.0 1.0
答案 1 :(得分:1)
IIUC,您可以尝试以下方法:
df_new=df.groupby(['USER_ID',pd.Grouper(key='DATE', freq='W')])['ACTIVITY_CATEGORY']\
.count().reset_index()
df_new['week_num']=(df_new.DATE.dt.day//7)+1
print(df_new.pivot_table(index='USER_ID',columns=['week_num']).fillna(0))
ACTIVITY_CATEGORY
week_num 2 3 4
USER_ID
AA1 0.0 1.0 2.0
AA3 2.0 0.0 0.0
AB1 0.0 1.0 0.0
AB4 2.0 1.0 0.0
CD3 0.0 0.0 1.0
如果存在第1周,则应该自动填充。