应用与嵌套 for 循环

我正在尝试在 python 中构建一个填充有 1 和 0 的数据框,具体取决于一列中的数字:


Date        Hour

2005-01-01  1

2005-01-01  2

2005-01-01  3

2005-01-01  4

我想根据“小时”中的数字创建新列,如果该行等于“小时”中的值,则用 1 填充每列,否则用 0 填充。


Date        Hour HE1 HE2 HE3 HE4

2005-01-01  1    1   0   0   0

2005-01-01  2    0   1   0   0

2005-01-01  3    0   0   1   0

2005-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() 的一个很好的应用程序(没有双关语),但我无法让它正常工作。


你会如何加快这个速度?


饮歌长啸
浏览 102回答 3
3回答

海绵宝宝撒

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] = 1df.join(pd.DataFrame(b, df.index, h).add_prefix('HE'))         Date  Hour  HE1  HE2  HE3  HE40  2005-01-01     1    1    0    0    01  2005-01-01     2    0    1    0    02  2005-01-01     3    0    0    1    03  2005-01-01     4    0    0    0    1

浮云间

即使它与@jezrael 的答案非常相似,但这也更好,(它只是使用.str访问器get_dummies:print(df.join(df['Hour'].astype(str).str.get_dummies().add_prefix('HE')))输出:         Date  Hour  HE1  HE2  HE3  HE40  2005-01-01     1    1    0    0    01  2005-01-01     2    0    1    0    02  2005-01-01     3    0    0    1    03  2005-01-01     4    0    0    0    1
打开App,查看更多内容
随时随地看视频慕课网APP

相关分类

Python