Python 在两个数据框中按日期标记
在一个数据集中记录所有日期,第二个数据集记录开始日期 我想标记df1的记录,与df2的开始日期相比,如果记录“0”早于开始日期,则标记“1”如果是开始日期之后的一天。 结果是我想要的Python 在两个数据框中按日期标记,python,pandas,dataframe,label,Python,Pandas,Dataframe,Label,在一个数据集中记录所有日期,第二个数据集记录开始日期 我想标记df1的记录,与df2的开始日期相比,如果记录“0”早于开始日期,则标记“1”如果是开始日期之后的一天。 结果是我想要的 df2 name startdate A 14-07-07 B 18-09-09 C 19-03-15 D 16-06-28 我试着用datetime来处理它,但没用 简单示例数据集示例 df1 name date Label startdate A 14-04-05 0
df2
name startdate
A 14-07-07
B 18-09-09
C 19-03-15
D 16-06-28
我试着用datetime来处理它,但没用
简单示例数据集示例
df1
name date Label startdate
A 14-04-05 0 14-07-07
A 14-05-08 0 14-07-07
A 14-08-09 1 14-07-07
A 15-01-05 1 14-07-07
B 18-07-05 0 18-09-09
B 18-08-09 0 18-09-09
B 18-10-02 1 18-09-09
C 19-01-03 0 19-03-15
C 19-02-04 0 19-03-15
C 19-03-30 1 19-03-15
D 16-04-01 0 16-06-28
D 16-08-04 1 16-06-28
感谢您阅读用于添加新列,然后按更大的位置与新列进行比较,因为转换为数值0,使用1
:
或:
您可以
map
it:
df1['date'] = pd.to_datetime(df1['date'])
df2['startdate'] = pd.to_datetime(df2['startdate'])
df1['startdate'] = df1['name'].map(df2.set_index('name')['startdate'])
df1.insert(2, 'Label', df1['date'].gt(df1['startdate']).view('i1'))
print (df1)
name date Label startdate
0 A 2014-04-05 0 2014-07-07
1 A 2014-05-08 0 2014-07-07
2 A 2014-08-09 1 2014-07-07
3 A 2015-01-05 1 2014-07-07
4 B 2018-07-05 0 2018-09-09
5 B 2018-08-09 0 2018-09-09
6 B 2018-10-02 1 2018-09-09
7 C 2019-01-03 0 2019-03-15
8 C 2019-02-04 0 2019-03-15
9 C 2019-03-30 1 2019-03-15
10 D 2016-04-01 0 2016-06-28
11 D 2016-08-04 1 2016-06-28
它起作用了,谢谢。我有2个问题,1。在insert中,2表示0或1?2.视图的i1来自何处?@ybin-表示位置,
1
表示添加第二列view
用于将布尔值转换为0,1
如True->1
,False->0
那么,i1是否将gt的真/假值更改为1/0,可以认为“i1”具有更改布尔值的固定含义,而不是单独指定的值吗?@ybin-您认为在df1.insert中(2,
?这是新列的唯一位置,可以自由将ot更改为0,1,2
,以查看差异。已解决!谢谢!您也可以这样做。谢谢您的回答!
df1 = pd.DataFrame(np.array([['A', '2015-12-21'],['A', '2015-12-22'], ['A', '2015-12-25'], ['B', '2018-01-28'],['B', '2018-02-28'],['B', '2018-03-28']]),
columns=['name', 'date'])
df2 = pd.DataFrame(np.array([['A', '2015-12-23'], ['B', '2018-03-01']]),
columns=['name', 'startdate'])
df1['date'] = pd.to_datetime(df1['date'])
df2['startdate'] = pd.to_datetime(df2['startdate'])
df = df1.merge(df2, on='name', how='left')
df.insert(2, 'Label', df['date'].gt(df['startdate']).view('i1'))
print (df)
name date Label startdate
0 A 2014-04-05 0 2014-07-07
1 A 2014-05-08 0 2014-07-07
2 A 2014-08-09 1 2014-07-07
3 A 2015-01-05 1 2014-07-07
4 B 2018-07-05 0 2018-09-09
5 B 2018-08-09 0 2018-09-09
6 B 2018-10-02 1 2018-09-09
7 C 2019-01-03 0 2019-03-15
8 C 2019-02-04 0 2019-03-15
9 C 2019-03-30 1 2019-03-15
10 D 2016-04-01 0 2016-06-28
11 D 2016-08-04 1 2016-06-28
df1['date'] = pd.to_datetime(df1['date'])
df2['startdate'] = pd.to_datetime(df2['startdate'])
df1['startdate'] = df1['name'].map(df2.set_index('name')['startdate'])
df1.insert(2, 'Label', df1['date'].gt(df1['startdate']).view('i1'))
print (df1)
name date Label startdate
0 A 2014-04-05 0 2014-07-07
1 A 2014-05-08 0 2014-07-07
2 A 2014-08-09 1 2014-07-07
3 A 2015-01-05 1 2014-07-07
4 B 2018-07-05 0 2018-09-09
5 B 2018-08-09 0 2018-09-09
6 B 2018-10-02 1 2018-09-09
7 C 2019-01-03 0 2019-03-15
8 C 2019-02-04 0 2019-03-15
9 C 2019-03-30 1 2019-03-15
10 D 2016-04-01 0 2016-06-28
11 D 2016-08-04 1 2016-06-28
print (df1.assign(new=(df1["date"]>df1["name"].map(df2.set_index("name")["startdate"])).astype(int),
start=df1["name"].map(df2.set_index("name")["startdate"])))
name date new start
0 A 14-04-05 0 14-07-07
1 A 14-05-08 0 14-07-07
2 A 14-08-09 1 14-07-07
3 A 15-01-05 1 14-07-07
4 B 18-07-05 0 18-09-09
5 B 18-08-09 0 18-09-09
6 B 18-10-02 1 18-09-09
7 C 19-01-03 0 19-03-15
8 C 19-02-04 0 19-03-15
9 C 19-03-30 1 19-03-15
10 D 16-04-01 0 16-06-28
11 D 16-08-04 1 16-06-28