bea*_*cub 2 python apply pandas
我正在尝试在python中构建一个填充了1和0的数据帧,具体取决于一列中的数字:
Date Hour
2005-01-01 1
2005-01-01 2
2005-01-01 3
2005-01-01 4
Run Code Online (Sandbox Code Playgroud)
我想根据"小时"中的数字创建新列,如果该行等于"小时"中的值,则填充每列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
Run Code Online (Sandbox Code Playgroud)
我可以使用此代码执行此操作,但需要很长时间:
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
Run Code Online (Sandbox Code Playgroud)
我觉得这对于.apply()来说是一个很棒的应用程序(没有双关语),但我无法让它正常工作.
你会如何加快速度?
在pandas循环中不建议使用,因为如果存在一些矢量化解决方案则很慢.
注意:功能apply也是引擎盖下的循环.
因此,使用pandas.get_dummies和DataFrame.add_prefix并join用于添加到原df:
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
Run Code Online (Sandbox Code Playgroud)
类似功能有不同的表现:
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)
Run Code Online (Sandbox Code Playgroud)