Pandas INT列数据类型根据数据的调用方式而变化(BUG?)

时间:2016-09-12 07:14:03

标签: python pandas numpy

我有一个包含两列的数据框XY,一列是整数列,另一列是浮点列。

整数列称为Count(带有大写字母C以避免出现问题),其唯一值如下:

XY["Count"].unique()
array([ 38,   7,   1,  13,   3,  28,   5,   6,   4,  11,   9,   2,   8,
        22,  12,  15,  20,  17,  18,  10,  40,  14,  16,  24,  25,  39,
        81,  19,  21, 110,  88,  23,  29,  46,  26,  32,  36,  43,  96,
        34,  47,  61,  35,  56,  41,  33,  30,  53,  27,  54,  37,  65,
        31,  52,  42,  93,  76,  57,  49,  71,  48,  77,  50,  84,  44,
        69,  75,  58,  60,  55,  72, 536,  67,  80,  64,  82, 101,  99,
       104,  68,  45,  66,  87,  90,  78,  74,  62,  73,  63,  86, 108,
       105, 197, 118, 209,  70,  59,  98,  97,  94,  79,  89,  51,  83,
        85, 221, 322, 164, 116, 103, 107, 102, 143,  91,  95,  92, 120,
       188, 148, 106, 179, 124, 165, 122, 113, 119, 169, 109, 138, 123,
       121, 125, 129, 177, 137, 206, 127, 115, 111, 131, 117, 128, 100,
       126, 163, 133, 186, 114, 203, 135, 141, 227, 162], dtype=int64)

正如您所看到的那样,它只是整数而numpy正确地将其解释为int64

现在让我们看一下提取单个值:

XY["Count"][0]
38
XY["Count"][0].dtype
numpy.int32

XY.ix[0,"Count"]
38
XY.ix[0,"Count"].dtype
numpy.int32

因此,直接建立索引并使用列标签ix返回int32

XY.loc[0,"Count"]
38.0
XY.loc[0,"Count"].dtype
numpy.float64

XY.ix[0,0]
38.0
XY.ix[0,0].dtype
numpy.float64

XY.iloc[0,0]
38.0
XY.iloc[0,0].dtype
numpy.float64

lociloc和基于索引的ix报告的格式为float64

现在,当我直接从内部numpy数组中提取值时,它也是float64。请记住,我的第二列是浮动列。

XY.values[0,0]
38.0
XY.values[0,0].dtype
numpy.float64

我不知道我是否遗漏了某些东西,但这确实不一致并导致问题,因为我需要专门以整数格式返回数据。我认为这是一个错误。

编辑1:

当使用只有整数列的数据框进行测试时,每个方法返回int32,所以看起来问题来自第二列和不一致的内部数据转换。

1 个答案:

答案 0 :(得分:0)

我认为你得到了一个浮点数,因为你的数据帧的每一行都包含整数和浮点类型的混合。选择具有ixloc的行索引后,整数将转换为浮点数。要解决这个问题,您可以使用loc从所需的列中进行选择,而不是从整个数据框中进行选择:

XY['Count'].loc[4]