英文:
How to select user_id rows pandas
问题
用户ID 已下单 最早日期 最晚日期
1 1 2020年9月14日 2020年10月24日
2 0 2020年9月14日 NAT
3 1 2020年9月1日 2020年10月19日
3 2 2021年2月11日 2021年3月1日
英文:
How can I calculate the first visited date and the last visited date before an order was placed by the user?
USER ID TYPE DATE
1 Visited September 14, 2020
1 Visited October 4, 2020
1 Visited October 24, 2020
1 Ordered November 1, 2020
2 Visited September 14, 2020
2 Visited October 1, 2020
3 Visited September 1, 2020
3 Visited October 4, 2020
3 Visited October 4, 2020
3 Visited October 19, 2020
3 Ordered January 1, 2021
3 Visited February 11, 2021
3 Visited February 24, 2021
3 Visited March 1, 2021
3 Ordered April 21, 2021
Expected Output:
USER ID Ordered MIN DATE MAX DATE
1 1 September 14, 2020 October 24, 2020
2 0 September 14, 2020 NAT
3 1 September 1, 2020 October 19, 2020
3 2 February 11, 2021 March 1, 2021
答案1
得分: 1
以下是翻译好的部分:
尝试:
df['DATE'] = pd.to_datetime(df['DATE'])
df_out = df.assign(grp=(df['TYPE'] == 'Ordered')[::-1].cumsum())\
.set_index(['USER ID', 'grp', 'TYPE'], append=True)['DATE']\
.unstack('TYPE')\
.groupby(['USER ID', 'grp'], sort=False)\
.agg(Ordered=('Ordered','count'),
MIN_DATE=('Visited','first'),
MAX_DATE=('Visited','last'))\
.reset_index('grp', drop=True)\
.reset_index()
df_out['MAX_DATE'] = df_out['MAX_DATE'].mask(df_out['Ordered'] == 0)
df_out['Ordered'] = df_out['Ordered'].groupby(df_out['USER ID']).cumsum()
df_out['MIN_DATE'] = df_out['MIN_DATE'].dt.strftime('%Y年%m月%d日')
df_out['MAX_DATE'] = df_out['MAX_DATE'].dt.strftime('%Y年%m月%d日')
输出:
用户ID 已订购 最小日期 最大日期
0 1 1 2020年09月14日 2020年10月24日
1 2 0 2020年09月14日 NaN
2 3 1 2020年09月01日 2020年10月19日
3 3 2 2021年02月11日 2021年03月01日
英文:
Try:
df['DATE'] = pd.to_datetime(df['DATE'])
df_out = df.assign(grp=(df['TYPE'] == 'Ordered')[::-1].cumsum())\
.set_index(['USER ID', 'grp', 'TYPE'], append=True)['DATE']\
.unstack('TYPE')\
.groupby(['USER ID', 'grp'], sort=False)\
.agg(Ordered=('Ordered','count'),
MIN_DATE=('Visited','first'),
MAX_DATE=('Visited','last'))\
.reset_index('grp', drop=True)\
.reset_index()
df_out['MAX_DATE'] = df_out['MAX_DATE'].mask(df_out['Ordered'] == 0)
df_out['Ordered'] = df_out['Ordered'].groupby(df_out['USER ID']).cumsum()
df_out['MIN_DATE'] = df_out['MIN_DATE'].dt.strftime('%B %d, %Y')
df_out['MAX_DATE'] = df_out['MAX_DATE'].dt.strftime('%B %d, %Y')
Output:
USER ID Ordered MIN_DATE MAX_DATE
0 1 1 September 14, 2020 October 24, 2020
1 2 0 September 14, 2020 NaN
2 3 1 September 01, 2020 October 19, 2020
3 3 2 February 11, 2021 March 01, 2021
通过集体智慧和协作来改善编程学习和解决问题的方式。致力于成为全球开发者共同参与的知识库,让每个人都能够通过互相帮助和分享经验来进步。
评论