为了账号安全,请及时绑定邮箱和手机立即绑定

应用与嵌套 for 循环

应用与嵌套 for 循环

饮歌长啸 2021-06-07 11:22:50
我正在尝试在 python 中构建一个填充有 1 和 0 的数据框,具体取决于一列中的数字:Date        Hour2005-01-01  12005-01-01  22005-01-01  32005-01-01  4我想根据“小时”中的数字创建新列,如果该行等于“小时”中的值,则用 1 填充每列,否则用 0 填充。Date        Hour HE1 HE2 HE3 HE42005-01-01  1    1   0   0   02005-01-01  2    0   1   0   02005-01-01  3    0   0   1   02005-01-01  4    0   0   0   1我可以用这段代码做到这一点,但需要很长时间:for x in range(1,5):    _HE = 'HE' + str(x)    for i in load.index:        load.at[i, _HE] = 1 if load.at[i,'Hour']==x else 0我觉得这是 .apply() 的一个很好的应用程序(没有双关语),但我无法让它正常工作。你会如何加快这个速度?
查看完整描述

3 回答

?
海绵宝宝撒

TA贡献1809条经验 获得超8个赞

pandas.factorize 和数组切片分配

j, h = pd.factorize(df.Hour)

i = np.arange(len(df))


b = np.zeros((len(df), len(h)), dtype=h.dtype)

b[i, j] = 1


df.join(pd.DataFrame(b, df.index, h).add_prefix('HE'))


         Date  Hour  HE1  HE2  HE3  HE4

0  2005-01-01     1    1    0    0    0

1  2005-01-01     2    0    1    0    0

2  2005-01-01     3    0    0    1    0

3  2005-01-01     4    0    0    0    1


查看完整回答
反对 回复 2021-06-09
?
浮云间

TA贡献1829条经验 获得超4个赞

即使它与@jezrael 的答案非常相似,但这也更好,(它只是使用.str访问器get_dummies:


print(df.join(df['Hour'].astype(str).str.get_dummies().add_prefix('HE')))

输出:


         Date  Hour  HE1  HE2  HE3  HE4

0  2005-01-01     1    1    0    0    0

1  2005-01-01     2    0    1    0    0

2  2005-01-01     3    0    0    1    0

3  2005-01-01     4    0    0    0    1


查看完整回答
反对 回复 2021-06-09
  • 3 回答
  • 0 关注
  • 101 浏览
慕课专栏
更多

添加回答

举报

0/150
提交
取消
微信客服

购课补贴
联系客服咨询优惠详情

帮助反馈 APP下载

慕课网APP
您的移动学习伙伴

公众号

扫描二维码
关注慕课网微信公众号