Python 3.x 中的(分区依据)上的sql max()
我正试图通过分区为max获得相同的SQL输出,但是在pandas中。 目标是将did_renew==No替换为Yes,但在特定条件下,针对一组数据帧 这是我的数据名:Python 3.x 中的(分区依据)上的sql max(),python-3.x,pandas,Python 3.x,Pandas,我正试图通过分区为max获得相同的SQL输出,但是在pandas中。 目标是将did_renew==No替换为Yes,但在特定条件下,针对一组数据帧 这是我的数据名: date_id sf_id renewal_date is_up_for_renewal did_renew datediff 168 2020-09-01 0010O00001n1s1rQAA 2020-09-30 Yes Undeter
date_id sf_id renewal_date is_up_for_renewal did_renew datediff
168 2020-09-01 0010O00001n1s1rQAA 2020-09-30 Yes Undetermined NaN
169 2020-08-01 0010O00001n1s1rQAA 2020-09-30 No Undetermined 1.0
170 2020-07-01 0010O00001n1s1rQAA 2020-09-30 No Undetermined 1.0
171 2020-06-01 0010O00001n1s1rQAA 2020-09-30 No Undetermined 1.0
172 2020-05-01 0010O00001n1s1rQAA 2020-09-30 No Undetermined 1.0
173 2020-04-01 0010O00001n1s1rQAA 2020-09-30 No Undetermined 1.0
174 2020-03-01 0010O00001n1s1rQAA 2020-09-30 No Undetermined 1.0
175 2020-02-01 0010O00001n1s1rQAA 2020-09-30 No Undetermined 1.0
176 2020-01-01 0010O00001n1s1rQAA 2020-09-30 No Undetermined 1.0
177 2019-12-01 0010O00001n1s1rQAA 2020-09-30 No Undetermined 1.0
178 2019-11-01 0010O00001n1s1rQAA 2020-09-30 No Undetermined 1.0
179 2019-10-01 0010O00001n1s1rQAA 2020-09-30 No Undetermined 1.0
180 2019-08-01 0010O00001n1s1rQAA 2019-08-31 Yes No 2.0
181 2019-07-01 0010O00001n1s1rQAA 2019-08-31 No No 1.0
182 2019-06-01 0010O00001n1s1rQAA 2019-08-31 No No 1.0
183 2019-05-01 0010O00001n1s1rQAA 2019-08-31 No No 1.0
184 2019-04-01 0010O00001n1s1rQAA 2019-08-31 No No 1.0
185 2019-03-01 0010O00001n1s1rQAA 2019-08-31 No No 1.0
186 2019-02-01 0010O00001n1s1rQAA 2019-08-31 No No 1.0
187 2019-01-01 0010O00001n1s1rQAA 2019-08-31 No No 1.0
188 2018-12-01 0010O00001n1s1rQAA 2019-08-31 No No 1.0
189 2018-11-01 0010O00001n1s1rQAA 2019-08-31 No No 1.0
190 2018-10-01 0010O00001n1s1rQAA 2019-08-31 No No 1.0
191 2018-09-01 0010O00001n1s1rQAA 2019-08-31 No No 1.0
192 2018-08-01 0010O00001n1s1rQAA 2019-08-31 No No 1.0
在SQL中,我会这样写:当dafediff=2时,max('Yes')over(按sf\u id、续订日期划分)结束
这将创建一个新列,其值仅适用于第180-192行(请参见第168-179、180-192行的续订日期不同)
这就是结果在列target
中的显示方式:
date_id sf_id renewal_date is_up_for_renewal did_renew datediff target
168 2020-09-01 0010O00001n1s1rQAA 2020-09-30 Yes Undetermined NaN Undetermined
169 2020-08-01 0010O00001n1s1rQAA 2020-09-30 No Undetermined 1.0 Undetermined
170 2020-07-01 0010O00001n1s1rQAA 2020-09-30 No Undetermined 1.0 Undetermined
171 2020-06-01 0010O00001n1s1rQAA 2020-09-30 No Undetermined 1.0 Undetermined
172 2020-05-01 0010O00001n1s1rQAA 2020-09-30 No Undetermined 1.0 Undetermined
173 2020-04-01 0010O00001n1s1rQAA 2020-09-30 No Undetermined 1.0 Undetermined
174 2020-03-01 0010O00001n1s1rQAA 2020-09-30 No Undetermined 1.0 Undetermined
175 2020-02-01 0010O00001n1s1rQAA 2020-09-30 No Undetermined 1.0 Undetermined
176 2020-01-01 0010O00001n1s1rQAA 2020-09-30 No Undetermined 1.0 Undetermined
177 2019-12-01 0010O00001n1s1rQAA 2020-09-30 No Undetermined 1.0 Undetermined
178 2019-11-01 0010O00001n1s1rQAA 2020-09-30 No Undetermined 1.0 Undetermined
179 2019-10-01 0010O00001n1s1rQAA 2020-09-30 No Undetermined 1.0 Undetermined
180 2019-08-01 0010O00001n1s1rQAA 2019-08-31 Yes No 2.0 Yes
181 2019-07-01 0010O00001n1s1rQAA 2019-08-31 No No 1.0 Yes
182 2019-06-01 0010O00001n1s1rQAA 2019-08-31 No No 1.0 Yes
183 2019-05-01 0010O00001n1s1rQAA 2019-08-31 No No 1.0 Yes
184 2019-04-01 0010O00001n1s1rQAA 2019-08-31 No No 1.0 Yes
185 2019-03-01 0010O00001n1s1rQAA 2019-08-31 No No 1.0 Yes
186 2019-02-01 0010O00001n1s1rQAA 2019-08-31 No No 1.0 Yes
187 2019-01-01 0010O00001n1s1rQAA 2019-08-31 No No 1.0 Yes
188 2018-12-01 0010O00001n1s1rQAA 2019-08-31 No No 1.0 Yes
189 2018-11-01 0010O00001n1s1rQAA 2019-08-31 No No 1.0 Yes
190 2018-10-01 0010O00001n1s1rQAA 2019-08-31 No No 1.0 Yes
191 2018-09-01 0010O00001n1s1rQAA 2019-08-31 No No 1.0 Yes
192 2018-08-01 0010O00001n1s1rQAA 2019-08-31 No No 1.0 Yes
完整的数据帧将包括多组sf_id,因此我知道我需要对[sf_id,续订日期]
使用groupby方法,但不确定如何实现这一点
提前谢谢 IIUC
df['target'] = (df.assign(target=df['datediff']==2))\
.groupby(['sf_id', 'renewal_date'])['target']\
.transform('max').map({True:'Yes',False:'Undetermined'})
输出:
date_id sf_id renewal_date is_up_for_renewal did_renew datediff target
168 2020-09-01 0010O00001n1s1rQAA 2020-09-30 Yes Undetermined NaN Undetermined
169 2020-08-01 0010O00001n1s1rQAA 2020-09-30 No Undetermined 1.0 Undetermined
170 2020-07-01 0010O00001n1s1rQAA 2020-09-30 No Undetermined 1.0 Undetermined
171 2020-06-01 0010O00001n1s1rQAA 2020-09-30 No Undetermined 1.0 Undetermined
172 2020-05-01 0010O00001n1s1rQAA 2020-09-30 No Undetermined 1.0 Undetermined
173 2020-04-01 0010O00001n1s1rQAA 2020-09-30 No Undetermined 1.0 Undetermined
174 2020-03-01 0010O00001n1s1rQAA 2020-09-30 No Undetermined 1.0 Undetermined
175 2020-02-01 0010O00001n1s1rQAA 2020-09-30 No Undetermined 1.0 Undetermined
176 2020-01-01 0010O00001n1s1rQAA 2020-09-30 No Undetermined 1.0 Undetermined
177 2019-12-01 0010O00001n1s1rQAA 2020-09-30 No Undetermined 1.0 Undetermined
178 2019-11-01 0010O00001n1s1rQAA 2020-09-30 No Undetermined 1.0 Undetermined
179 2019-10-01 0010O00001n1s1rQAA 2020-09-30 No Undetermined 1.0 Undetermined
180 2019-08-01 0010O00001n1s1rQAA 2019-08-31 Yes No 2.0 Yes
181 2019-07-01 0010O00001n1s1rQAA 2019-08-31 No No 1.0 Yes
182 2019-06-01 0010O00001n1s1rQAA 2019-08-31 No No 1.0 Yes
183 2019-05-01 0010O00001n1s1rQAA 2019-08-31 No No 1.0 Yes
184 2019-04-01 0010O00001n1s1rQAA 2019-08-31 No No 1.0 Yes
185 2019-03-01 0010O00001n1s1rQAA 2019-08-31 No No 1.0 Yes
186 2019-02-01 0010O00001n1s1rQAA 2019-08-31 No No 1.0 Yes
187 2019-01-01 0010O00001n1s1rQAA 2019-08-31 No No 1.0 Yes
188 2018-12-01 0010O00001n1s1rQAA 2019-08-31 No No 1.0 Yes
189 2018-11-01 0010O00001n1s1rQAA 2019-08-31 No No 1.0 Yes
190 2018-10-01 0010O00001n1s1rQAA 2019-08-31 No No 1.0 Yes
191 2018-09-01 0010O00001n1s1rQAA 2019-08-31 No No 1.0 Yes
192 2018-08-01 0010O00001n1s1rQAA 2019-08-31 No No 1.0 Yes
详细信息,很像我创建/
分配
临时列“target”时的情况,该列在datediff等于2时为真。然后,我将进入groupby
这个专栏,就像您在'sf\u id'和'renewal\u date'上的分区一样。接下来,我们使用transform
获取该组的最大“target”,从而为任何记录的datediff等于2的组中的所有记录创建True。最后,我们使用map
将True更改为Yes,将False更改为undeminated。我不知道它应该如何成为预期的输出,但如果它的函数与pandas中的SQL非常相似,则我编辑了我的问题以显示目标列,如果是这样的话helps@nimi1234不客气。快乐编码。保持安全和健康。