如何创建二进制列 timedelta 和 bin 列表

How to create a binary column a timedelta and a list of bins

我想从一个列表和一个时间增量创建一个二进制列。这是我目前所拥有的:

weather_list = ['5', '15', '30', '40'}
for i in weather_list:
    col = 'r_' + i
    epi.data[col] = np.where((help.data['help_beg_date'] + timedelta(float(i) -
                                                                 1)) >= help.data['HL_DATE'], 1, 0)

但是,此输出是累积的。例如;如果观察距离 help_beg_dt 16 天,它将 return 它来自列 r_5r_15r_30 的值作为 0、1、1, 1. 我需要输出列值为 0、1、0、0。1 值低于 r_30 但高于 r_15。

我正在考虑创建另一个列表来获得 i 的下一个序列;所以我可以使用大于和小于表达式。我假设你可能只用一个列表就可以做到这一点。

在我看来,您的问题是 'binning' 基于 windows 列表的列的变体。这通常通过 pd.cut 来实现。对你来说,你正在装箱的系列是

datediff = help.data['HL_DATE'] - help.data['help_beg_date']

并且您希望根据天气列表将其分类。首先我们需要将这些时间增量转换为天;这是通过系列的 dt.days 方法获得的(dt 是 datetime 的缩写)。然后我们可以使用 pd.cut 来构建这样的箱子(注意我在天气列表中添加了 0,以使 windows 有效):

weather_list = [0, 5, 15, 30, 40]
bins = pd.cut(datediff.dt.days, weather_list)
bins
0      (0, 5]
1     (5, 15]
2    (15, 30]
3    (15, 30]
dtype: category
Categories (4, object): [(0, 5] < (5, 15] < (15, 30] < (30, 40]]

最后可以将其转换为指标列 pd.get_dummies:

indicators = pd.get_dummies(bins)
indicators

   (0, 5]  (5, 15]  (15, 30]  (30, 40]
0       1        0         0         0
1       0        1         0         0
2       0        0         1         0
3       0        0         1         0

您可以使用

将这些添加到您的数据框中
pd.concat([epi.data,indicators],axis = 1)