【问题标题】:Python dataframe assign values based on another column with conditionPython数据框根据具有条件的另一列分配值
【发布时间】:2021-05-11 04:35:47
【问题描述】:

有一个包含 date 、 name 和 number 列的 df 。如果计数> 3,则尝试标记相同的名称记录。并且应该将状态标记为 old_employee 到最早的日期。

date                            name      number 

2021-05-06T07:35:03.000Z        mark       123
2021-04-06T07:35:03.000Z        mark       123
2021-03-03T07:35:03.000Z        mark       123
2021-02-03T07:35:03.000Z        mark       123

2021-05-06T07:35:03.000Z        tom       4123
2021-04-06T07:35:03.000Z        tom       4123
2021-03-03T07:35:03.000Z        tom       4123

2021-02-06T07:35:03.000Z        john       512


2021-02-06T07:35:03.000Z        wood       512
2021-02-06T07:35:03.000Z        wood       512


2020-05-06T07:35:03.000Z        paul       723
2020-04-06T07:35:03.000Z        paul       723
2020-03-03T07:35:03.000Z        paul       723
2020-02-03T07:35:03.000Z        paul       723
2020-02-03T05:35:03.000Z        paul       723
2020-02-02T07:35:03.000Z        paul       723
2020-02-01T07:35:03.000Z        paul       723

2020-05-06T07:35:03.000Z        tomy       623
2020-04-06T07:35:03.000Z        tomy       623
2020-03-03T07:35:03.000Z        tomy       623
2020-02-03T07:35:03.000Z        tomy       623        
2020-02-03T05:35:03.000Z        tomy       623        
2020-02-02T07:35:03.000Z        tomy       623        

如果同名记录超过 3 次,我们必须将最早日期的记录标记为 old_employee。

预期输出:

date                            name      number     status

2021-05-06T07:35:03.000Z        mark       123
2021-04-06T07:35:03.000Z        mark       123
2021-03-03T07:35:03.000Z        mark       123
2021-02-03T07:35:03.000Z        mark       123        old_employee

2021-05-06T07:35:03.000Z        tom       4123
2021-04-06T07:35:03.000Z        tom       4123
2021-03-03T07:35:03.000Z        tom       4123

2021-02-06T07:35:03.000Z        john       512


2021-02-06T07:35:03.000Z        wood       512
2021-02-06T07:35:03.000Z        wood       512


2020-05-06T07:35:03.000Z        paul       723
2020-04-06T07:35:03.000Z        paul       723
2020-03-03T07:35:03.000Z        paul       723
2020-02-03T07:35:03.000Z        paul       723        old_employee
2020-02-03T05:35:03.000Z        paul       723        old_employee
2020-02-02T07:35:03.000Z        paul       723        old_employee
2020-02-01T07:35:03.000Z        paul       723        old_employee

2020-05-06T07:35:03.000Z        tomy       623
2020-04-06T07:35:03.000Z        tomy       623
2020-03-03T07:35:03.000Z        tomy       623
2020-02-03T07:35:03.000Z        tomy       623        old_employee
2020-02-03T05:35:03.000Z        tomy       623        old_employee
2020-02-02T07:35:03.000Z        tomy       623        old_employee



试过这个:

(df.groupby('name', as_index=False).apply(lambda x: x if len(x)==1 else x.iloc[[-3]])
   .reset_index(level=0, drop=True))

【问题讨论】:

  • “记录最早的日期”是什么意思?如果有 4 个不同的日期,是否有包含多少个日期的标准?如果你说'记录'(单数),应该只有一个日期,对吧?如果有多个日期,我们如何决定包含多少个日期?

标签: python python-3.x pandas dataframe date


【解决方案1】:

你可以试试,

df.loc[df.groupby('name').cumcount() >= 3, 'status'] = 'old_employee'

【讨论】:

    【解决方案2】:

    GroupBy.cumcountnumpy.where 一起使用,并通过Series.ge 比较是否大于或等于:

    df['date'] = pd.to_datetime(df['date'])
    #if values not sorted by name and dates
    #df = df.sort_values(['name','date'])
    
    df['status'] = np.where(df.groupby('name').cumcount().ge(3), 'old_employee', '')
    print (df)
                                date  name  number        status
    0  2    021-05-06 07:35:03+00:00  mark     123              
    1  2    021-04-06 07:35:03+00:00  mark     123              
    2  2    021-03-03 07:35:03+00:00  mark     123              
    3  2    021-02-03 07:35:03+00:00  mark     123  old_employee
    4  2    021-05-06 07:35:03+00:00   tom    4123              
    5  2    021-04-06 07:35:03+00:00   tom    4123              
    6  2    021-03-03 07:35:03+00:00   tom    4123              
    7  2    021-02-06 07:35:03+00:00  john     512              
    8  2    021-02-06 07:35:03+00:00  wood     512              
    9  2    021-02-06 07:35:03+00:00  wood     512              
    10 2    020-05-06 07:35:03+00:00  paul     723              
    11 2    020-04-06 07:35:03+00:00  paul     723              
    12 2    020-03-03 07:35:03+00:00  paul     723              
    13 2    020-02-03 07:35:03+00:00  paul     723  old_employee
    14 2    020-02-03 05:35:03+00:00  paul     723  old_employee
    15 2    020-02-02 07:35:03+00:00  paul     723  old_employee
    16 2    020-02-01 07:35:03+00:00  paul     723  old_employee
    17 2    020-05-06 07:35:03+00:00  tomy     623              
    18 2    020-04-06 07:35:03+00:00  tomy     623              
    19 2    020-03-03 07:35:03+00:00  tomy     623              
    20 2    020-02-03 07:35:03+00:00  tomy     623  old_employee
    21 2    020-02-03 05:35:03+00:00  tomy     623  old_employee
    22 2    020-02-02 07:35:03+00:00  tomy     623  old_employee
    

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 2019-09-02
      • 1970-01-01
      • 2022-07-30
      • 1970-01-01
      • 1970-01-01
      • 2020-10-29
      • 2021-05-06
      • 2020-05-23
      相关资源
      最近更新 更多