这是我的数据库:
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())
但是它没有给出理想的结果。
感谢您的帮助!
答案 0 :(得分:1)
使用Series.where
将carr
列中不匹配的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.where
,ffill()
分配目标值
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