问题描述
尊敬的stackoverflow朋友们, 我需要大熊猫用户的帮助,完成一项非常简单的任务,但我无法解决自己的问题。
这里是每个人都有入场记录的df,但是,人们有多种服务(他们可以退房-午餐休息时间-再次进入)。
df按人,日期和入场时间升序排列。
我需要提取第一个记录的入口,因此排除其他入口(例如:午饭后)。 为了获得所需的输出(1st_stamp),我需要检查当前行是否是当天的第一天(同一个人ofc),然后在“ 1st_stamp”列上出现“ y” “。
这很棘手,因为有些人只有1个入口(例如:Person N.3),有些人只有2个(Person N.2),有些人将午餐分成两个休息时间,因此他们有3个记录在案的入口(Person N. 7)。
您将如何解决这个难题?
Ps:能够清除此数据对于人员计划流程具有巨大的用途。 谢谢亲爱的:)
+-------------+------------+------------------+----------+-----------+
| name | Date | start | tstart | 1st_stamp |
+-------------+------------+------------------+----------+-----------+
| Person N. 1 | 13/08/2020 | 13/08/2020 07:00 | 07:00:00 | y |
| Person N. 1 | 13/08/2020 | 13/08/2020 13:10 | 13:10:00 | n |
| Person N. 2 | 13/08/2020 | 13/08/2020 10:00 | 10:00:00 | y |
| Person N. 2 | 13/08/2020 | 13/08/2020 13:46 | 13:46:00 | n |
| Person N. 3 | 13/08/2020 | 13/08/2020 09:00 | 09:00:00 | y |
| Person N. 4 | 13/08/2020 | 13/08/2020 08:00 | 08:00:00 | y |
| Person N. 4 | 13/08/2020 | 13/08/2020 13:04 | 13:04:00 | n |
| Person N. 4 | 13/08/2020 | NaT | NaT | n |
| Person N. 5 | 13/08/2020 | 13/08/2020 10:00 | 10:00:00 | y |
| Person N. 6 | 13/08/2020 | 13/08/2020 07:00 | 07:00:00 | y |
| Person N. 6 | 13/08/2020 | 13/08/2020 13:29 | 13:29:00 | n |
| Person N. 7 | 13/08/2020 | 13/08/2020 08:00 | 08:00:00 | y |
| Person N. 7 | 13/08/2020 | 13/08/2020 14:01 | 14:01:00 | n |
| Person N. 7 | 13/08/2020 | 13/08/2020 16:00 | 16:00:00 | n |
+-------------+------------+------------------+----------+-----------+
解决方法
如果我理解正确,您想创建1st_stamp列吗?
要创建1st_stamp
列,这是一种处理方法:
# 1. Convert to datetime if it isn't already
df['start'] = pd.to_datetime(df['start'])
# 2. Partition data by name and rank them based on start datetime
df['order'] = df.groupby('name')['start'].rank(method='min')
# 3. Create a variable to indicate if it's the earliest instance
df['1st_stamp'] = np.where(df['order']==1,'y','n')
df
从this stackoverflow answer复制第二步。
这将创建order
列-如果您不需要它,则可以使用del(df['order'])
删除它。
确保该列是日期时间;
df['start'] = pd.to_datetime(df['start'])
您第一次可以做类似的事情;
df.groupby(['name','Date','tstart']).first()
还是第一次和参赛人数;
grouped = df.groupby(['name','tstart']).agg({'tstart': ['min','count']})