Warning: file_get_contents(/data/phpspider/zhask/data//catemap/8/python-3.x/19.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Python-基于多个日期创建一个新列_Python_Python 3.x_Pandas_Dataframe - Fatal编程技术网

Python-基于多个日期创建一个新列

Python-基于多个日期创建一个新列,python,python-3.x,pandas,dataframe,Python,Python 3.x,Pandas,Dataframe,我有一个非常大的数据帧。 我想根据其他列“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/2

我有一个非常大的数据帧。
我想根据其他列“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”:如果用户ID出现在2017年1月2日之前和2017年1月2日当天或之后(应满足这两个条件),则返回值为“1”
“0”:如果不满足上述条件,则应将此行分配给“0”。

示例1:userid 48在2017年1月2日之前出现两次,在2017年1月2日之后出现一次。因此,userid 48的结果列中的值应为“1”,因为这两个条件都满足。
示例2:userid 393在我们的数据中出现两次,但在这两个记录中,其日期都在2017年1月2日之后。因此,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
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
我不知道实现这一目标的最佳方法

有人能帮忙吗?提前谢谢

这应该能奏效

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)