我有一个非常大的dataframe,有一个列有字符串和一个固定长度的二进制数。
我想把每一个二进制数字分割成他自己的列,我有一个工作代码,但速度非常慢。我的代码是:
import numpy as np
import pandas as pd
#data generation
stringLength=5
stringFormat='{0:0'+str(stringLength)+'b}'
temp = [ stringFormat.format(x) for x in np.random.randint(0,high=2**stringLength, size=int(1e6))]
df=pd.DataFrame(temp,columns=['binaryString'])
#slow code below
df.attrs['Some data to preserve']=""
df,df.attrs = df.join(df['binaryString'].str.split('',expand=True).iloc[:, 1:-1].add_prefix('Bit').astype(np.uint8)), df.attrs
print(df) 能做得更快吗?
我不能使用Pandarallel,因为它需要“Linux的Windows子系统”,我也不能从Visual运行它,但是我可以使用另一个并行化。
发布于 2021-04-15 07:23:19
从代码开始,关键点是:
df,df.attrs = df.join(df['binaryString'].str.split('',expand=True).iloc[:, 1:-1].add_prefix('Bit').astype(np.uint8)), df.attrs平均每环2.01 s±13.2ms(平均±std )。dev.7次运行,每一次循环1次)
我尝试过另一种方法:
df.join(pd.DataFrame(df['binaryString'].map(list).to_list(), columns=['a','b','c','d','e']))这似乎很有希望,它需要: 468 ms±4.58ms/圈(平均±std )。dev.7次运行,每一次循环1次)
我认为直接处理值(底层的numpy)可以更快一些。
OP编辑(自动命名列):
df,df.attrs =df.join(pd.DataFrame(df['binaryString'].map(list).to_list()).add_prefix('Bit').astype(np.uint8)), df.attrshttps://stackoverflow.com/questions/67103668
复制相似问题