将布尔数据帧转换为二进制数列

时间:2017-04-13 03:40:39

标签: python pandas

我有一个布尔型pandas DataFrame,如下所示

aaa = pd.DataFrame([[False,False,False], [True,True,True]])

我想将它转换为二进制数字数组,对于这个DataFrame" aaa", 结果是[000,111]

如何实施此转化?

任何帮助将不胜感激。感谢

4 个答案:

答案 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之后转换intstrnumpy 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] << 12

的连续权力
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:])