根据下面的行检查一个值,如果当前行是第一个唯一值,则返回

问题描述

尊敬的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']})