使用python将数字转换为二进制并存储在pandas中的多列中

使用python将数字转换为二进制并存储在pandas中的多列中,python,pandas,dataframe,binary,Python,Pandas,Dataframe,Binary,我想将一个数字转换成二进制,并使用Python存储在Pandas中的多个列中。 这里有一个例子 df = pd.DataFrame([['a', 1], ['b', 2], ['c', 0]], columns=["Col_A", "Col_B"]) for i in range(0,len(df)): df.loc[i,'Col_C'],df.loc[i,'Col_D'] = list( (bin(df.loc[i,'Col_B']).zfill(2) ) ) 我试图转换二进制文件

我想将一个数字转换成二进制,并使用Python存储在Pandas中的多个列中。 这里有一个例子

df = pd.DataFrame([['a', 1], ['b', 2], ['c', 0]], columns=["Col_A", "Col_B"])

for i in range(0,len(df)):
    df.loc[i,'Col_C'],df.loc[i,'Col_D'] = list( (bin(df.loc[i,'Col_B']).zfill(2) ) )
我试图转换二进制文件并将其存储在dataframe中的多列中。将数字转换为二进制后,输出必须包含2位数字。它工作得很好

问题:如果我的数据集包含数千条记录,我可以看到性能差异。若我想提高上述代码的性能,我们该如何做? 我尝试使用下面的单行代码,但对我不起作用

df[['Col_C','Col_D']] = list( (bin(df['Col_B']).zfill(2) ) )

apply
是您正在寻找的方法

df[['Col_C','Col_D']] = df['Col_B'].apply(lambda x: pd.Series(list(bin(x)[2:].zfill(2))))
这就是诀窍

我在3000行上对其进行了基准测试,它比您提到的for cycle方法(0.5秒vs 3秒)更快。但是通常速度不会快很多,因为它仍然需要为每一行分别应用函数

from time import time
start = time()
for i in range(0,len(df)):
    df.loc[i,'Col_C'],df.loc[i,'Col_D'] = list( (bin(df.loc[i,'Col_B'])[2:].zfill(2) ) )
print(time() - start)
# 3.4339962005615234

start = time()
df[['Col_C','Col_D']] = df['Col_B'].apply(lambda x: pd.Series(list(bin(x)[2:].zfill(2))))
print(time() - start)
# 0.5619983673095703

注意:我使用的是python 3,例如
bin(1)
返回
'0b1'
,因此我使用
bin(x)[2://code>来摆脱
'0b'
部分。

如果性能很重要,请使用
numpy

d=df['Col_B'].值
m=2
df['Col_C','Col_D']=pd.DataFrame(((D[:,None]&(10).astype(int))
打印(df)
列A列B列C列D
0 a 11 0
1B201
2 c 0 0 0 0
性能(大约快1000倍):

df=pd.DataFrame([[a',1],[b',2],[c',0]],columns=[“Col_a”,“Col_b”])
df=pd.concat([df]*1000,忽略索引=True)
在[162]中:%%timeit
…:df['Col_C','Col_D']=df['Col_B'].应用(lambda x:pd.系列(列表(bin(x)[2:].zfill(2)))
...: 
每个回路609 ms±14.5 ms(7次运行的平均值±标准偏差,每个回路1次)
在[163]中:%%timeit
…:d=df['Col_B']。值
…:m=2
…:df['Col_C','Col_D']=pd.DataFrame(((D[:,None]&(10).astype(int))
...: 
每个回路618µs±26.2µs(7次运行的平均值±标准偏差,每个1000个回路)

@jezrael,你的解决方案奏效了。这真的很快。我已经处理了50K条记录,使用你的解决方案花了将近13秒。Matej解决方案只用了不到1秒。我需要处理大量数据。我想提高性能。
d = df['Col_B'].values
m = 2
df[['Col_C','Col_D']]  = pd.DataFrame((((d[:,None] & (1 << np.arange(m)))) > 0).astype(int))
print (df)
  Col_A  Col_B  Col_C  Col_D
0     a      1      1      0
1     b      2      0      1
2     c      0      0      0
df = pd.DataFrame([['a', 1], ['b', 2], ['c', 0]], columns=["Col_A", "Col_B"])


df = pd.concat([df] * 1000, ignore_index=True)

In [162]: %%timeit
     ...: df[['Col_C','Col_D']] = df['Col_B'].apply(lambda x: pd.Series(list(bin(x)[2:].zfill(2))))
     ...: 
609 ms ± 14.5 ms per loop (mean ± std. dev. of 7 runs, 1 loop each)

In [163]: %%timeit
     ...: d = df['Col_B'].values
     ...: m = 2
     ...: df[['Col_C','Col_D']]  = pd.DataFrame((((d[:,None] & (1 << np.arange(m)))) > 0).astype(int))
     ...: 
618 µs ± 26.2 µs per loop (mean ± std. dev. of 7 runs, 1000 loops each)