【问题标题】:Python - Create a new column based on multiple datesPython - 基于多个日期创建一个新列
【发布时间】:2020-02-10 12:35:43
【问题描述】:

我有一个非常大的数据框。
我想根据其他列 'userid' 和 'date' 创建一个新列 'result'。
用户 ID 有两条或多条记录。

import pandas as pd
import numpy as np

userid = ['1','1','22','48','48','48','393','393','555','555'] 
date = ['11/01/2016','11/02/2016','11/05/2016','11/08/2016','12/02/2016','02/12/2017','02/22/2017','02/28/2017','12/15/2016','02/28/2017'] 
df1 = pd.DataFrame({"userid": userid, "date": date})

userid  date
  1   11/01/2016
  1   11/02/2016
 22   11/05/2016
 48   11/08/2016
 48   12/02/2016
 48   02/12/2017
393   02/22/2017
393   02/28/2017
555   12/15/2016
555   02/28/2017

这个新列“结果”中有两种类型的值。
'1':如果 userid 出现在 02/01/2017 之前,并且在 02/01/2017 或之后(两个条件都应满足),则返回值为 '1'。
'0':如果不满足上述条件,则应将此行赋值为'0'。

示例 1:用户 ID 48 在 2017 年 2 月 1 日之前出现两次,在 2017 年 2 月 1 日之后出现一次。因此,userid 48 的结果列中的值应为“1”,因为这两个条件都满足。
示例 2:用户 ID 393 在我们的数据中出现了两次,但在两条记录中它的日期都在 02/01/2017 之后。因此,userid 393 的结果列中的值应为 '0'。

在这种情况下,我的输出数据框将是:

userid     date   result
  1    11/01/2016   0
  1    11/02/2016   0
 22    11/05/2016   0
 48    11/08/2016   1
 48    12/02/2016   1
 48    02/12/2017   1
393    02/22/2017   0
393    02/28/2017   0
555    12/15/2016   1
555    02/28/2017   1

我不知道实现这一目标的最佳方法。
任何人都可以帮忙吗?提前致谢!

【问题讨论】:

    标签: python python-3.x pandas dataframe


    【解决方案1】:

    这应该可以解决问题

    import pandas as pd
    import numpy as np
    import datetime
    
    userid = ['1','1','22','48','48','48','393','393','555','555'] 
    date = ['11/01/2016','11/02/2016','11/05/2016','11/08/2016','12/02/2016','02/12/2017','02/22/2017','02/28/2017','12/15/2016','02/28/2017'] 
    df1 = pd.DataFrame({"userid": userid, "date": date})
    
    # convert date type to datetime
    df1['date'] = pd.to_datetime(df1['date'])
    
    # define threshold date
    dt = datetime.datetime(2017, 2, 1)
    
    # logic
    fn = lambda _: 1 if _.min()<dt and _.max()>=dt else 0
    res = df1.groupby('userid')['date'].agg(fn).reset_index()
    res.rename({'date':'result'}, axis=1, inplace=True)
    df1.merge(res)
    

    输出

    userid     date   result
      1    11/01/2016   0
      1    11/02/2016   0
     22    11/05/2016   0
     48    11/08/2016   1
     48    12/02/2016   1
     48    02/12/2017   1
    393    02/22/2017   0
    393    02/28/2017   0
    555    12/15/2016   1
    555    02/28/2017   1
    

    【讨论】:

      猜你喜欢
      • 2020-06-07
      • 2020-08-11
      • 1970-01-01
      • 1970-01-01
      • 2022-01-04
      • 1970-01-01
      • 2019-12-25
      • 1970-01-01
      • 1970-01-01
      相关资源
      最近更新 更多