【问题标题】:Check a value against row below, return if current row is the first unique value检查下面的行的值,如果当前行是第一个唯一值,则返回
【发布时间】:2020-12-06 10:08:09
【问题描述】:

亲爱的stackoverflow朋友们, 我需要 Pandas 资深用户的帮助来完成一项我自己无法解决的非常简单的任务。

这里有一个记录了每个人的入口的 df,但是,有 多个 人的入口(他们进入 - 午休时退房 - 再次进入)。

df 按人物、日期和入场时间升序排列。

我需要提取第一个记录的入口,从而排除其他入口(例如:午休后)。 要获得所需的输出(1st_stamp),我需要检查当前行是否是当天的第一行(同一个人的),然后“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         |
+-------------+------------+------------------+----------+-----------+

【问题讨论】:

  • 到目前为止你尝试了什么?

标签: python pandas dataframe date row


【解决方案1】:

如果我理解正确,您想创建 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']) 将其删除。

【讨论】:

  • 当您访问罗马时,我欠您一杯啤酒!
  • 哈哈,感谢 Arci 的好意。都好。很高兴这很有帮助。 :)
【解决方案2】:

确保该列是日期时间;

df['start'] = pd.to_datetime(df['start'])

返回第一次你可以做类似的事情;

df.groupby(['name', 'Date', 'tstart']).first()

或第一次和条目数;

grouped = df.groupby(['name', 'Date', 'tstart']).agg({'tstart': ['min', 'count']})

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2020-08-17
    • 2021-02-05
    • 2019-06-24
    • 2016-01-09
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多