模拟熊猫中的浮动列和索引的最优雅方法

时间:2018-11-08 17:49:36

标签: python pandas

我有一个熊猫数据框,可以说它代表一个“混淆矩阵”(即索引和列是相同的)。每个索引/列均以浮点数表示,因为它对应于明确的预定调查表值。

但是,这带来了一个问题,因为众所周知在熊猫中使用浮点表示是一件危险的事情。示例:

说我有这个代码:

>>> import numpy, pandas
>>> Labels = numpy.arange(1, 3.5, 0.2)
>>> Data = numpy.random.randint( low = 0, high = 100, size = (13,13) )
>>> DF = pandas.DataFrame( index = Labels, columns = Labels, data = Data )

产生一个看起来很可爱的数据框:

>>> DF
     1.0  1.2  1.4  1.6  1.8  2.0  2.2  2.4  2.6  2.8  3.0  3.2  3.4
1.0   77   35    5   40    9   45   14   85   16   63   43   72   92
1.2   96   93   12   87   14    3   79   53   19   53    4   41   47
1.4    1   79    9   94   95   52   64   71   97    2   57   12   75
1.6   55   48   55   14   90   57   75   39   16   86   42   41   50
1.8   31   60   10   89   70   66   31   74   87   26   83   17   77
2.0   95   27   77   59   54   31   73   22   64   49   84   38   47
2.2   66   49   66   28   91   74   54   85   62   56   36   18   39
2.4   38   59   89   90   44   22   66   92   29   22   71   22   89
2.6   58   42   46   88   86   29    1   34   38   76   27   73    6
2.8   14    5   80   61    5   18   44   76   84   21   42   87   82
3.0   41   67   37   64   92   50   61   48   49   43   47   37   81
3.2   29   99   47   10   61   17   28   35    7   30   37   70   33
3.4   56   95   21   12   48   31   61   71   41   19   13   14   52

如果我尝试在视觉报告的索引/列上获取值:

>>> DF.get_value(2.0, 2.0)
[...]
KeyError: 2.0

当然的原因是,标签内部与仅“漂亮”打印时所显示的内容有所不同。例如:

>>> Labels
array([1. , 1.2, 1.4, 1.6, 1.8, 2. , 2.2, 2.4, 2.6, 2.8, 3. , 3.2, 3.4])

>>> [str(i) for i in Labels]
['1.0', '1.2', '1.4', '1.5999999999999999', '1.7999999999999998', '1.9999999999999998', '2.1999999999999997', '2.3999999999999995', '2.5999999999999996', '2.8', '2.9999999999999996', '3.1999999999999993', '3.3999999999999995']

我很高兴使用字符串而不是浮点数作为索引(即类似DF.get_value('2.0', '2.0')之类的东西),但是,我不想手工编写类似['1.0', '1.2', '1.4', ...]之类的东西。我无法想象没有更好的方法来使这种事情起作用。

我缺少明显的东西吗?

编辑。我在输入时就意识到,就像在SO上提问时的常见情况一样,我可以简单地使用字符串格式创建索引数组。但是我愿意接受其他建议,以防有人可以提出更明显的建议(特别是如果涉及到首先使用字符串)。

0 个答案:

没有答案