Python 3.x 中的(分区依据)上的sql max()

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

我正试图通过分区为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               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不客气。快乐编码。保持安全和健康。