我有一个布尔型pandas DataFrame,如下所示
aaa = pd.DataFrame([[False,False,False], [True,True,True]])
我想将它转换为二进制数字数组,对于这个DataFrame" aaa", 结果是[000,111]
如何实施此转化?
任何帮助将不胜感激。感谢
答案 0 :(得分:3)
你可以这样做:
aaa = pd.DataFrame([[False,False,False],
[True,True,True]])
aaa=aaa.astype(int)
然后aaa
是
0 1 2
0 0 0 0
1 1 1 1
如果你想获得阵列['000','111']
,你可以这样做:
aaa = pd.DataFrame([[False,False,False],
[True,True,True]])
aaa=aaa.astype(int).astype(str)
[''.join(i) for i in aaa.values.tolist()]
答案 1 :(得分:1)
您可以在values
之后转换int
和str
到numpy array
,然后sum
转换:
print (aaa.astype(int).astype(str).values.sum(axis=1))
['000' '111']
答案 2 :(得分:1)
您可以乘以bit shifted operator来模拟2的幂,求和,然后转换为二进制
aaa.mul(np.arange(3)[::-1] << 1).sum(1).apply(bin)
0 0b0
1 0b110
dtype: object
请注意np.arange(3)[::-1] << 1
是2
array([4, 2, 0])
您可以通过使用str
操作
aaa.mul(
np.arange(3)[::-1] << 1
).sum(1).apply(bin).str.replace('0b', '').str.zfill(3)
0 000
1 110
dtype: object
答案 3 :(得分:0)
我会做以下其中一项:
a.astype(int).astype(str).sum(axis=1).astype(int).astype(str)
但根据我的口味,这有点太多了。
另一种可能性是使用apply:
a.astype(int).astype(str).apply(lambda x: ''.join(list(x)))
但对我来说最清楚的是通过乘法获得所需的数字,然后将其转换为二进制数:
a.dot([4, 2, 1]).map(lambda x: bin(x))
当然,如果您不想在开头使用'0b',只需使用
即可a.dot([4, 2, 1]).map(lambda x: bin(x)[2:])