Python 我如何可以&;数据帧中的大数字?

Python 我如何可以&;数据帧中的大数字?,python,pandas,Python,Pandas,我想对数据帧中的二进制值使用操作“&”。小于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 但对于大

我想对数据帧中的二进制值使用操作“&”。小于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

您可以通过执行
df.a.values&2
来实现这一点,它绕过了pandas重载并在底层Python类型上工作

区别在于,较大的数字太大,无法放入64位有符号整数类型(
np.int64
),因此pandas使您的数据类型列
对象
。在对象列上,
&
执行逻辑操作,而不是按位操作

可以通过以下方式使用无符号整数获取序列:

>>> bigNums = pandas.Series([12345678901234567890,2,3], dtype=np.uint64)
>>> bigNums & 2
0    2
1    2
2    2
dtype: uint64

但显然,您无法创建具有uint64列的数据帧,因为。即使可以,如果对uint64使用的整数太大,最终也会遇到同样的问题。

我的数字大于100位。@parvij:那么您可能无法在numpy中对其执行位运算。100位数字需要超过300位,我不知道有任何这样的数据类型,在numpy中肯定没有!我错了吗?@parvij:这是内置Python类型上的位运算符。类可以重载运算符以执行它们想要的任何操作。如果列具有数据类型对象,则Pandas重载
&
,以执行逻辑操作。正如我在回答中所说,您的列有dtype对象,因为您的数字对于64位整数来说太大了。@parvij:我编辑了我的回答,以表明您可以通过执行
df.a.values&2
来获得所需的内容。您能解释一下为什么要这样做吗?那么大的数字将太大,不适合任何标准化的数据类型,这意味着您根本不能将它们与numpy一起使用。(熊猫会处理它们,但只能作为Python对象处理,速度不会有任何提高。)@BrenBarn:我制作了一些关联规则,我将它们保存为二进制模式,然后我想用每个测试记录的模式来处理它们,如果结果等于关联规则的模式,那么记录满足条件……好的。请注意,如果您有大量这样大小的数据,您的操作可能会变得非常缓慢。