python - 使用python将数字转换为二进制并存储在pandas的多列中
问题描述
我想使用 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) ) )
我正在尝试转换二进制文件并将其存储在数据框中的多个列中。将数字转换为二进制后,输出必须包含 2 位数字。它工作正常。
问题:如果我的数据集包含数千条记录,我可以看到性能差异。如果我想提高上述代码的性能,我们该怎么做?我尝试使用以下单行代码,这对我不起作用。
df[['Col_C','Col_D']] = list( (bin(df['Col_B']).zfill(2) ) )
解决方案
如果性能很重要,请使用numpy
此解决方案:
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
性能(大约快 1000 倍):
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)
推荐阅读
- access-token - Square 最多可以生成多少个访问令牌?
- java - 如何完成多线程编程问题
- unity3d - 贴花环绕网格
- android - Flutter - 如何调试原生android代码
- javascript - 关闭或打开javascript时如何显示
- python - Python - 阅读 Google Ads 关键字规划 .csv
- go - 如何找出选择器是在第一个还是最后一个位置
- maven - 在 Google Cloud SQL 环境中执行 maven 单元测试
- python - python中的aws cli和awcli驱动程序:如何设置端点?
- wordpress - 极慢的 WordPress 网站