首页
学习
活动
专区
圈层
工具
发布
社区首页 >问答首页 >apply vs嵌套for循环

apply vs嵌套for循环
EN

Stack Overflow用户
提问于 2018-09-03 13:56:53
回答 3查看 175关注 0票数 3

我正在尝试用python构建一个用1和0填充的dataframe,这取决于一列中的数字:

代码语言:javascript
复制
Date        Hour
2005-01-01  1
2005-01-01  2
2005-01-01  3
2005-01-01  4

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

代码语言:javascript
复制
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

我可以用下面的代码做到这一点,但这需要很长时间:

代码语言:javascript
复制
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()应用程序(没有双关语),但是我不能让它正常工作。

您将如何加速此过程?

EN

回答 3

Stack Overflow用户

回答已采纳

发布于 2018-09-03 13:58:29

在pandas中,不推荐使用循环,因为如果存在一些向量化的解决方案,速度会很慢。

注意:在函数中,apply也是隐藏在幕后的循环。

因此使用pandas.get_dummiesDataFrame.add_prefixjoin来添加到原始df

代码语言:javascript
复制
df = df.join(pd.get_dummies(df['Hour'].astype(str)).add_prefix('HE'))
print (df)
         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

类似函数具有不同的性能:

代码语言:javascript
复制
df = pd.concat([df] * 1000, ignore_index=True)

In [62]: %timeit df.join(pd.get_dummies(df['Hour'].astype(str)).add_prefix('HE'))
3.54 ms ± 277 µs per loop (mean ± std. dev. of 7 runs, 100 loops each)

#U9-Forward solution
In [63]: %timeit df.join(df['Hour'].astype(str).str.get_dummies().add_prefix('HE'))
61.6 ms ± 297 µs per loop (mean ± std. dev. of 7 runs, 10 loops each)
票数 5
EN

Stack Overflow用户

发布于 2018-09-03 14:04:46

pandas.factorize和数组切片分配

代码语言:javascript
复制
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
票数 0
EN

Stack Overflow用户

发布于 2018-09-03 14:04:46

尽管它与@jezrael的答案非常相似,但是,这也要好得多(它只是为get_dummies使用了.str访问器

代码语言:javascript
复制
print(df.join(df['Hour'].astype(str).str.get_dummies().add_prefix('HE')))

输出:

代码语言:javascript
复制
         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
票数 0
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/52143854

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档