我希望从列表和timedelta创建二进制列。以下是我到目前为止的情况:
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天,它会将列r_5
,r_15
和r_30
中的值作为0,1,1,1返回。我需要输出列值为0,1,0,0。1值低于r_30
但超过r_15。
我正在考虑创建另一个列表来获得下一个i序列;所以我可以使用更大和更小的表达。我假设您可以只使用一个列表来执行此操作。
答案 0 :(得分:0)
在我看来,您的问题是对“binning'基于窗口列表的列。这通常由pd.cut
实现。对你来说,你正在装箱的系列是
datediff = help.data['HL_DATE'] - help.data['help_beg_date']
并且您希望根据天气列表将其分类。首先,我们需要将这些时间转换为天;这是通过系列的dt.days
方法加入的(dt
是datetime的缩写)。然后我们可以使用pd.cut
来构建这样的箱子(注意我已经在天气列表中添加了0,以制作有效的窗口):
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)