Python和Pandas - pd.Series中int32和int64的差异

8

我开始学习Python、NumPy和Pandas,但有一个非常基础的问题是关于大小。

请看下面的代码块:

1. 长度:6,dtype:int64

# create a Series from a dict
pd.Series({key: value for key, value in zip('abcdef', range(6))})

对比

2. 长度: 6,数据类型: int32

# but why does this generate a smaller integer size???
pd.Series(range(6), index=list('abcdef'))

问题

我认为当你将列表、numpy数组、字典等放入pd.Series中,你会得到int64,但当你只将range(6)放入pd.Series中时,你会得到int32。有人能帮忙解释一下吗?

对于这个很基本的问题,非常抱歉。

@Edit:我使用的是Pandas版本0.20.1和Numpy 1.12.1


你的Python、NumPy和操作系统版本是什么? - EdChum
1个回答

4

在语义上它们是不同的,因为在第一种版本中,您传递一个带有单个标量值的字典,因此dtype变为int64,而对于第二种情况,您传递了一个可以轻松转换为numpy数组的range,这是int32

In[57]:
np.array(range(6)).dtype

Out[57]: dtype('int32')

因此,pandas的series构建涉及第一实例中的dtype匹配和第二实例中的无类型,因为它可转换为numpy数组,numpy已确定在这种情况下首选int32。
更新
看起来这取决于您的numpy版本和可能的pandas版本。我正在运行python 3.6,numpy 1.12.1和pandas 0.20.3,并获得上述结果。我还在运行Windows 7 64位。jeremycg正在运行pandas 0.19.2和numpy 1.11.2,并观察到相同的结果,而coldspeed正在运行numpy 1.13.1并观察到int64。从中可以得出结论,dtype将在很大程度上由numpy决定。
我相信这个line是在我们在这种情况下传递range时被称为的。
subarr = np.array(arr, dtype=object, copy=copy)

返回的类型由numpy和操作系统决定,在我的情况下,Windows将C Long定义为32位。请参见相关链接:在Windows 10 64位机器上,默认情况下numpy数组dtype为int32

2
那可能就是原因了。我的numpy版本是1.13.1,我也得到了Bharath的结果。 - cs95
2
必须这样做:https://dev59.com/WVoV5IYBdhLWcg3wauOP - ayhan
2
@ayhan,我相信pandas将尝试在传入的数据上调用np.array构造函数,如果它是可迭代或类似数组的话,那么dtype将来自于numpy。在第一种情况下,标量类型以这种形式传递时,默认值为int64 - EdChum
1
@ayhan 我认为这一行代码:https://github.com/pandas-dev/pandas/blob/83436af8ae1ccad49b7ceac7471c060d823d10ab/pandas/core/series.py#L2994 是在这种情况下最终被调用的。 - EdChum
1
@ayhan 我认为一旦我们有了numpy数组并且dtype不是混合的,那么dtype就会直接传递,我正在尝试搜索代码以查找任何明确的内容,但它似乎会使用该数组创建Singleblockmanager,然后调用NDFrame.__init__,在那里它将只进行复制。 - EdChum
显示剩余13条评论

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接