熊猫groupby(),transform()和ffill()

时间:2020-09-16 08:19:21

标签: pandas dataframe

这是我的数据库:

          date_id    company is_up_for_renewal renewal_date      carr
33     2020-09-01   company1               Yes   2020-09-28  32100.00
34     2020-08-01   company1                No   2020-09-28  32100.00
35     2020-07-01   company1                No   2020-09-28  32100.00
36     2020-06-01   company1                No   2020-09-28  32100.00
37     2020-05-01   company1                No   2020-09-28  32100.00
38     2020-04-01   company1                No   2020-09-28  32100.00
39     2020-03-01   company1                No   2020-09-28  32100.00
40     2020-02-01   company1                No   2020-09-28  32100.00
41     2020-01-01   company1                No   2020-09-28  32100.00
42     2019-12-01   company1                No   2020-09-28  32100.00
43     2019-11-01   company1                No   2020-09-28  32100.00
44     2019-10-01   company1                No   2020-09-28  32100.00
45     2019-09-01   company1               Yes   2019-09-28  32100.00
46     2019-08-01   company1                No   2019-09-28  32100.00
47     2019-07-01   company1                No   2019-09-28  32100.00
48     2019-06-01   company1                No   2019-09-28  30000.00
49     2019-05-01   company1                No   2019-09-28  30000.00
50     2019-04-01   company1                No   2019-09-28  30000.00
51     2019-03-01   company1                No   2019-09-28  30000.00
52     2019-02-01   company1                No   2019-09-28  30000.00
53     2019-01-01   company1                No   2019-09-28  30000.00
54     2018-12-01   company1                No   2019-09-28  30000.00
55     2018-11-01   company1                No   2019-09-28  30000.00
56     2018-10-01   company1                No   2019-09-28  30000.00
57     2018-09-01   company1                No   2019-09-28  30000.00
58     2018-08-01   company1                No   2019-09-28  30000.00
59     2018-07-01   company1                No   2019-09-28  30000.00
60     2018-06-01   company1                No   2019-09-28  30000.00
61     2018-05-01   company1                No   2019-09-28  30000.00
62     2018-04-01   company1                No   2019-09-28  30000.00
63     2018-03-01   company1                No   2019-09-28  30000.00
55759  2019-04-01  company 2               Yes   2019-04-06      0.00
55760  2019-03-01  company 2                No   2019-04-06  57399.96
55761  2019-02-01  company 2                No   2019-04-06  57399.96
55762  2019-01-01  company 2                No   2019-04-06  57399.96
55763  2018-12-01  company 2                No   2019-04-06  57399.96
55764  2018-11-01  company 2                No   2019-04-06  57399.96
55765  2018-10-01  company 2                No   2019-04-06  57399.96
55766  2018-09-01  company 2                No   2019-04-06  57399.96
55767  2018-08-01  company 2                No   2019-04-06  57399.96
55768  2018-07-01  company 2                No   2019-04-06  57399.96
55769  2018-06-01  company 2                No   2019-04-06  57399.96
55770  2018-05-01  company 2                No   2019-04-06  57399.96
55771  2018-04-01  company 2                No   2019-04-06  57399.96
55772  2018-03-01  company 2                No   2019-04-06  57399.96
55773  2018-02-01  company 2                No   2019-04-06  57399.96
55774  2018-01-01  company 2                No   2019-04-06  57399.96

我想为carr(行33,45,55759)的行创建一个具有is_up_for_renewal==Yes值的新列。 其中应包含groupby([company,renewal_date])。 结果应该如下:

          date_id    company is_up_for_renewal renewal_date      carr  target
33     2020-09-01  company1   Yes               2020-09-28   32100.00  32100 
34     2020-08-01  company1   No                2020-09-28   32100.00  32100 
35     2020-07-01  company1   No                2020-09-28   32100.00  32100 
36     2020-06-01  company1   No                2020-09-28   32100.00  32100 
37     2020-05-01  company1   No                2020-09-28   32100.00  32100 
38     2020-04-01  company1   No                2020-09-28   32100.00  32100 
39     2020-03-01  company1   No                2020-09-28   32100.00  32100 
40     2020-02-01  company1   No                2020-09-28   32100.00  32100 
41     2020-01-01  company1   No                2020-09-28   32100.00  32100 
42     2019-12-01  company1   No                2020-09-28   32100.00  32100 
43     2019-11-01  company1   No                2020-09-28   32100.00  32100 
44     2019-10-01  company1   No                2020-09-28   32100.00  32100 
45     2019-09-01  company1   Yes               2019-09-28   32100.00  32100 
46     2019-08-01  company1   No                2019-09-28   32100.00  32100 
47     2019-07-01  company1   No                2019-09-28   32100.00  32100 
48     2019-06-01  company1   No                2019-09-28   30000.00  32100 
49     2019-05-01  company1   No                2019-09-28   30000.00  32100 
50     2019-04-01  company1   No                2019-09-28   30000.00  32100 
51     2019-03-01  company1   No                2019-09-28   30000.00  32100 
52     2019-02-01  company1   No                2019-09-28   30000.00  32100 
53     2019-01-01  company1   No                2019-09-28   30000.00  32100 
54     2018-12-01  company1   No                2019-09-28   30000.00  32100 
55     2018-11-01  company1   No                2019-09-28   30000.00  32100 
56     2018-10-01  company1   No                2019-09-28   30000.00  32100 
57     2018-09-01  company1   No                2019-09-28   30000.00  32100 
58     2018-08-01  company1   No                2019-09-28   30000.00  32100 
59     2018-07-01  company1   No                2019-09-28   30000.00  32100 
60     2018-06-01  company1   No                2019-09-28   30000.00  32100 
61     2018-05-01  company1   No                2019-09-28   30000.00  32100 
62     2018-04-01  company1   No                2019-09-28   30000.00  32100 
63     2018-03-01  company1   No                2019-09-28   30000.00  32100 
55759  2019-04-01  company 2  Yes               2019-04-06   0.00      0     
55760  2019-03-01  company 2  No                2019-04-06   57399.96  0     
55761  2019-02-01  company 2  No                2019-04-06   57399.96  0     
55762  2019-01-01  company 2  No                2019-04-06   57399.96  0     
55763  2018-12-01  company 2  No                2019-04-06   57399.96  0     
55764  2018-11-01  company 2  No                2019-04-06   57399.96  0     
55765  2018-10-01  company 2  No                2019-04-06   57399.96  0     
55766  2018-09-01  company 2  No                2019-04-06   57399.96  0     
55767  2018-08-01  company 2  No                2019-04-06   57399.96  0     
55768  2018-07-01  company 2  No                2019-04-06   57399.96  0     
55769  2018-06-01  company 2  No                2019-04-06   57399.96  0     
55770  2018-05-01  company 2  No                2019-04-06   57399.96  0     
55771  2018-04-01  company 2  No                2019-04-06   57399.96  0     
55772  2018-03-01  company 2  No                2019-04-06   57399.96  0     
55773  2018-02-01  company 2  No                2019-04-06   57399.96  0     
55774  2018-01-01  company 2  No                2019-04-06   57399.96  0        

我尝试了以下代码: sub1['target'] = sub1.assign(target=sub1['is_up_for_renewal']=='Yes').groupby(['company','renewal_date'])['carr'].transform(max) 但是,对于第二家公司,而不是零分公司给出了57399。 还尝试了这段代码:

sub1['target'] = sub1.assign(target=sub1['is_up_for_renewal']=='Yes').groupby(['company','renewal_date'])['carr'].transform(lambda v: v.ffill())

但是它没有给出理想的结果。

感谢您的帮助!

2 个答案:

答案 0 :(得分:1)

使用Series.wherecarr列中不匹配的target值替换为sub1['target'] = (sub1.assign(target=sub1['carr'].where(sub1['is_up_for_renewal']=='Yes')) .groupby(['company','renewal_date'])['target'].ffill()) 列中的缺失值,然后此列按组向前填充:

print (sub1)
          date_id    company is_up_for_renewal renewal_date      carr   target
33     2020-09-01   company1               Yes   2020-09-28  32100.00  32100.0
34     2020-08-01   company1                No   2020-09-28  32100.00  32100.0
35     2020-07-01   company1                No   2020-09-28  32100.00  32100.0
36     2020-06-01   company1                No   2020-09-28  32100.00  32100.0
37     2020-05-01   company1                No   2020-09-28  32100.00  32100.0
38     2020-04-01   company1                No   2020-09-28  32100.00  32100.0
39     2020-03-01   company1                No   2020-09-28  32100.00  32100.0
40     2020-02-01   company1                No   2020-09-28  32100.00  32100.0
41     2020-01-01   company1                No   2020-09-28  32100.00  32100.0
42     2019-12-01   company1                No   2020-09-28  32100.00  32100.0
43     2019-11-01   company1                No   2020-09-28  32100.00  32100.0
44     2019-10-01   company1                No   2020-09-28  32100.00  32100.0
45     2019-09-01   company1               Yes   2019-09-28  32100.00  32100.0
46     2019-08-01   company1                No   2019-09-28  32100.00  32100.0
47     2019-07-01   company1                No   2019-09-28  32100.00  32100.0
48     2019-06-01   company1                No   2019-09-28  30000.00  32100.0
49     2019-05-01   company1                No   2019-09-28  30000.00  32100.0
50     2019-04-01   company1                No   2019-09-28  30000.00  32100.0
51     2019-03-01   company1                No   2019-09-28  30000.00  32100.0
52     2019-02-01   company1                No   2019-09-28  30000.00  32100.0
53     2019-01-01   company1                No   2019-09-28  30000.00  32100.0
54     2018-12-01   company1                No   2019-09-28  30000.00  32100.0
55     2018-11-01   company1                No   2019-09-28  30000.00  32100.0
56     2018-10-01   company1                No   2019-09-28  30000.00  32100.0
57     2018-09-01   company1                No   2019-09-28  30000.00  32100.0
58     2018-08-01   company1                No   2019-09-28  30000.00  32100.0
59     2018-07-01   company1                No   2019-09-28  30000.00  32100.0
60     2018-06-01   company1                No   2019-09-28  30000.00  32100.0
61     2018-05-01   company1                No   2019-09-28  30000.00  32100.0
62     2018-04-01   company1                No   2019-09-28  30000.00  32100.0
63     2018-03-01   company1                No   2019-09-28  30000.00  32100.0
55759  2019-04-01  company 2               Yes   2019-04-06      0.00      0.0
55760  2019-03-01  company 2                No   2019-04-06  57399.96      0.0
55761  2019-02-01  company 2                No   2019-04-06  57399.96      0.0
55762  2019-01-01  company 2                No   2019-04-06  57399.96      0.0
55763  2018-12-01  company 2                No   2019-04-06  57399.96      0.0
55764  2018-11-01  company 2                No   2019-04-06  57399.96      0.0
55765  2018-10-01  company 2                No   2019-04-06  57399.96      0.0
55766  2018-09-01  company 2                No   2019-04-06  57399.96      0.0
55767  2018-08-01  company 2                No   2019-04-06  57399.96      0.0
55768  2018-07-01  company 2                No   2019-04-06  57399.96      0.0
55769  2018-06-01  company 2                No   2019-04-06  57399.96      0.0
55770  2018-05-01  company 2                No   2019-04-06  57399.96      0.0
55771  2018-04-01  company 2                No   2019-04-06  57399.96      0.0
55772  2018-03-01  company 2                No   2019-04-06  57399.96      0.0
55773  2018-02-01  company 2                No   2019-04-06  57399.96      0.0
55774  2018-01-01  company 2                No   2019-04-06  57399.96      0.0

for col in DC_columns:
    NAN_VALUE = CAT_NAN_VALUE if 'C' in col else INT_NAN_VALUE
    value_counts = df.select(col).groupby(col).count().filter('count < 6').select(col)
    df_low = df.join(value_counts, col,'left_semi')
    df_high = df.join(value_counts, col,'left_anti')    
    df_low = df_low.withColumn(col, lit(NAN_VALUE))
    df = df_low.union(df_high)

答案 1 :(得分:1)

使用np.whereffill()分配目标值

df=df.assign(target=np.where(df.is_up_for_renewal=='Yes',df.carr,np.nan)).ffill()

 date_id   company is_up_for_renewal renewal_date      carr   target
33     2020-09-01  company1               Yes   2020-09-28  32100.00  32100.0
34     2020-08-01  company1                No   2020-09-28  32100.00  32100.0
35     2020-07-01  company1                No   2020-09-28  32100.00  32100.0
36     2020-06-01  company1                No   2020-09-28  32100.00  32100.0
37     2020-05-01  company1                No   2020-09-28  32100.00  32100.0
38     2020-04-01  company1                No   2020-09-28  32100.00  32100.0
39     2020-03-01  company1                No   2020-09-28  32100.00  32100.0
40     2020-02-01  company1                No   2020-09-28  32100.00  32100.0
41     2020-01-01  company1                No   2020-09-28  32100.00  32100.0
42     2019-12-01  company1                No   2020-09-28  32100.00  32100.0
43     2019-11-01  company1                No   2020-09-28  32100.00  32100.0
44     2019-10-01  company1                No   2020-09-28  32100.00  32100.0
45     2019-09-01  company1               Yes   2019-09-28    100.00    100.0
46     2019-08-01  company1                No   2019-09-28  32100.00    100.0
47     2019-07-01  company1                No   2019-09-28  32100.00    100.0
48     2019-06-01  company1                No   2019-09-28  30000.00    100.0
49     2019-05-01  company1                No   2019-09-28  30000.00    100.0
50     2019-04-01  company1                No   2019-09-28  30000.00    100.0
51     2019-03-01  company1                No   2019-09-28  30000.00    100.0
52     2019-02-01  company1                No   2019-09-28  30000.00    100.0
53     2019-01-01  company1                No   2019-09-28  30000.00    100.0
54     2018-12-01  company1                No   2019-09-28  30000.00    100.0
55     2018-11-01  company1                No   2019-09-28  30000.00    100.0
56     2018-10-01  company1                No   2019-09-28  30000.00    100.0
57     2018-09-01  company1                No   2019-09-28  30000.00    100.0
58     2018-08-01  company1                No   2019-09-28  30000.00    100.0
59     2018-07-01  company1                No   2019-09-28  30000.00    100.0
60     2018-06-01  company1                No   2019-09-28  30000.00    100.0
61     2018-05-01  company1                No   2019-09-28  30000.00    100.0
62     2018-04-01  company1                No   2019-09-28  30000.00    100.0
63     2018-03-01  company1                No   2019-09-28  30000.00    100.0
55759  2019-04-01  company2               Yes   2019-04-06      0.00      0.0
55760  2019-03-01  company2                No   2019-04-06  57399.96      0.0
55761  2019-02-01  company2                No   2019-04-06  57399.96      0.0
55762  2019-01-01  company2                No   2019-04-06  57399.96      0.0
55763  2018-12-01  company2                No   2019-04-06  57399.96      0.0
55764  2018-11-01  company2                No   2019-04-06  57399.96      0.0
55765  2018-10-01  company2                No   2019-04-06  57399.96      0.0
55766  2018-09-01  company2                No   2019-04-06  57399.96      0.0
55767  2018-08-01  company2                No   2019-04-06  57399.96      0.0
55768  2018-07-01  company2                No   2019-04-06  57399.96      0.0
55769  2018-06-01  company2                No   2019-04-06  57399.96      0.0
55770  2018-05-01  company2                No   2019-04-06  57399.96      0.0
55771  2018-04-01  company2                No   2019-04-06  57399.96      0.0
55772  2018-03-01  company2                No   2019-04-06  57399.96      0.0
55773  2018-02-01  company2                No   2019-04-06  57399.96      0.0
55774  2018-01-01  company2                No   2019-04-06  57399.96      0.0