我有一个这样的熊猫数据框,
id d1 d2
0 1 2016-12-15 2017-02-08
1 2 2017-04-28 2017-07-20
2 3 2017-07-28 2017-10-19
3 4 2018-02-20 2019-01-21
4 5 2019-03-19 2019-06-10
5 1 2019-05-24 2019-05-30
6 2 2019-06-04 2019-07-22
我想检查是否有任何d2大于下一个d1,如果是的话,我想将该d2设置为下一个d1-1。
我可以使用此代码找出要在哪里更改日期
x['d2'].gt(x['d1'].shift(-1))
我不确定此后如何有效进行。
我正在寻找的结果就是这样,
id d1 d2
0 1 2016-12-15 2017-02-08
1 2 2017-04-28 2017-07-20
2 3 2017-07-28 2017-10-19
3 4 2018-02-20 2019-01-21
4 5 2019-03-19 2019-05-23
5 1 2019-05-24 2019-05-30
6 2 2019-06-04 2019-07-22
如何在没有循环的熊猫中做到这一点?
我目前正在使用apply
这样来解决此问题,
x.apply(lambda x : x['d1_shifted'] - pd.Timedelta(days=1) if x['d2'] > x['d1_shifted'] else x['d2'], axis=1)
答案 0 :(得分:2)
尝试:
c=df.d2.gt(df.d1.shift(-1))
df=df.assign(d2=np.where(c,df.d1.shift(-1)-pd.Timedelta(1,unit='d'),df.d2))
print(df)
id d1 d2
0 1 2016-12-15 2017-02-08
1 2 2017-04-28 2017-07-20
2 3 2017-07-28 2017-10-19
3 4 2018-02-20 2019-01-21
4 5 2019-03-19 2019-05-23
5 1 2019-05-24 2019-05-30
6 2 2019-06-04 2019-07-22
答案 1 :(得分:1)
另一种方法是按如下方式使用来自.loc
和pd.DateOffset
的直接分配
m = df.d2.gt(df.d1.shift(-1))
df.loc[m, 'd2'] = df.shift(-1).loc[m, 'd1'] - pd.DateOffset(1)
Out[947]:
id d1 d2
0 1 2016-12-15 2017-02-08
1 2 2017-04-28 2017-07-20
2 3 2017-07-28 2017-10-19
3 4 2018-02-20 2019-01-21
4 5 2019-03-19 2019-05-23
5 1 2019-05-24 2019-05-30
6 2 2019-06-04 2019-07-22