【问题标题】:adding values to month columns based on date value根据日期值向月份列添加值
【发布时间】:2019-06-13 17:21:28
【问题描述】:

我有一个包含用户观察的数据框。

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

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

示例:用户 ID 3 已于 2018 年 3 月注册并于 2018 年 5 月取消。对于此观察,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```

【问题讨论】:

  • 您能否添加一些示例数据、预期输出,例如 2 个用户?
  • @jezrael 给你!

标签: python pandas


【解决方案1】:

在列表推导中使用period_range 查找匹配值的字典列表,创建DataFrame,将缺失值替换为0DataFrame.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)

【讨论】:

    猜你喜欢
    • 2016-08-22
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2019-07-11
    • 1970-01-01
    • 2021-09-08
    • 2020-12-31
    • 2021-01-24
    相关资源
    最近更新 更多