我有一个带有用户观察结果的数据框。
每个观察都有一个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```
答案 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)