我想使用“&”操作对数据帧中的二进制值。对于小于20位的数字,这是可以的,如下所示:
import pandas as pd
df=pd.DataFrame({"a":[1234567890123456789,2,3],"b":[4,5,6]})
df[df['a']&2==2]
Out[107]:
a b
1 2 5
2 3 6
df['a']&2
Out[108]:
0 0
1 2
2 2
Name: a, dtype: int64
但是对于大于19位的数字,我得到了这个:
import pandas as pd
df=pd.DataFrame({"a":[12345678901234567890,2,3],"b":[4,5,6]})
df[df['a']&2==2]
Out[109]:
Empty DataFrame
Columns: [a, b]
Index: []
df['a']&2
Out[110]:
0 True
1 True
2 True
Name: a, dtype: bool
答案 0 :(得分:1)
你可以通过df.a.values & 2
来做到这一点,它会绕过pandas重载并处理底层的Python类型。
不同之处在于,您的较大数字太大而无法容纳64位有符号整数类型(np.int64
),因此pandas会使您的列为dtype object
。在对象列上,&
执行逻辑运算,而不执行按位运算。
您可以通过这种方式使用无符号整数获得一系列:
>>> bigNums = pandas.Series([12345678901234567890,2,3], dtype=np.uint64)
>>> bigNums & 2
0 2
1 2
2 2
dtype: uint64
但显然您无法使用uint64列创建DataFrame,因为uint64 isn't fully supported in pandas。即使你可以,如果你使用的整数对于uint64来说太大了,你最终也会遇到同样的问题。