根据日期值将值添加到月份列

时间:2019-06-13 08:48:03

标签: python pandas

我有一个带有用户观察结果的数据框。

每个观察都有一个ID,用户ID,注册月份和取消月份。 每个userID可以具有多个条目(订单)。

我想每个月创建一个列,该列设置为1或0,具体取决于用户是否处于活动状态。我想在2017-01到2018-12之前有专栏

示例:userID 3已于2018-03签署,并于2018-05取消。对于此观察,2018-03、2018-04和2018-05列的值应为1,所有其他列的值应为0。

不确定如何以最有效的方式在python中进行操作。

预期产量

id  userID  signupmonth  cancelmonth  tenure  2017-01  2017-02 ... 2018-03  2018-04  2018-05 2018-06 ... 2018-12
23  23434  2018-03       2018-05      3       0        0       ... 1        1   1    0       0       ... 0
24  23435  2017-01       2018-03      14      1        1       ... 1        0   0    0       0       ... 0```

1 个答案:

答案 0 :(得分:1)

在列表推导中将period_range用于匹配值的字典列表,创建DataFrame,将丢失的值替换为0,将DataFrame.join替换为原始值:

L = [dict.fromkeys(pd.period_range(s, e), 1) 
           for s, e in zip(df['signupmonth'], df['cancelmonth'])]

rng = pd.period_range('2017-01', '2018-12', freq='m')
df1 = pd.DataFrame(L, index=df.index, columns=rng).fillna(0).astype(int)
print (df1)
   2017-01  2017-02  2017-03  2017-04  2017-05  2017-06  2017-07  2017-08  \
0        0        0        0        0        0        0        0        0   
1        1        1        1        1        1        1        1        1   

   2017-09  2017-10  ...  2018-03  2018-04  2018-05  2018-06  2018-07  \
0        0        0  ...        1        1        1        0        0   
1        1        1  ...        1        0        0        0        0   

   2018-08  2018-09  2018-10  2018-11  2018-12  
0        0        0        0        0        0  
1        0        0        0        0        0  

[2 rows x 24 columns]

df = df.join(df1)
#print (df)