pandas multiindex DataFrame中的圆形浮点数

Posted

技术标签:

【中文标题】pandas multiindex DataFrame中的圆形浮点数【英文标题】:Round floats in pandas multiindex DataFrame 【发布时间】:2021-02-15 15:34:46 【问题描述】:

我得到了一个以浮点数为索引的 pandas 多索引 DataFrame。考虑以下示例:

arrays = [[0.21,0.21,0.21,0.22,0.22,0.22,0.23,0.23,0.23],
          [0.81,0.8200000000000001,0.83,0.81,0.8200000000000001,0.83,0.81,0.8200000000000001,0.83]]
df = pd.DataFrame(np.random.randn(9, 2), index=arrays)

df

#               0           1
# 0.21  0.81    -2.234036   -0.145643
#       0.82    0.367248    -1.471617
#       0.83    -0.764520   0.686241
# 0.22  0.81    1.380429    1.546513
#       0.82    1.230707    1.826980
#       0.83    -1.198403   0.377323
# 0.23  0.81    -0.418367   -0.125763
#       0.82    0.682860    -0.119080
#       0.83    -1.802418   0.357573

我以这种形式获得了这个 DataFrame。现在,如果我想检索条目df.loc[(0.21, 0.82)],我会收到一个错误,因为索引实际上并没有携带0.82,而是0.8200000000000001。我事先不知道这些问题出现在索引的什么地方。我该如何解决这个问题?我的想法是将多索引的两个级别四舍五入到有效的小数位数,在这种情况下为 2。但怎么可能呢?有没有更好的解决方案?

【问题讨论】:

有更好的解决方案吗?这取决于具体情况;数据是什么,它的用途等等。我的想法是将多索引的两个级别四舍五入到有效的小数位数,在这种情况下为 2。但是怎么才能做到呢? 你有没有尝试过,做过任何研究?对“pandas round numbers”进行简单的网络搜索即可获得大部分信息。 【参考方案1】:

您可以使用rename 函数将函数应用于MultiIndex 的每个值:

df = df.rename(index=lambda val: round(val, 2))

print(df.loc[(.21, .82)])
0    0.260015
1   -0.233822
Name: (0.21, 0.82), dtype: float64

但是由于https://docs.python.org/3/tutorial/floatingpoint.html,我不确定是否将浮点数作为特定键 (简单例子)

>>> .1 + .1 + .1 == .3
False

虽然我很好奇其他人对此有何看法。因为我不确定您可能会遇到的现实问题。

您始终可以将浮点数截断为字符串,然后通过字符串访问您的数据框以确保准确性:

df = df.rename(index=":.2f".format)

print(df.loc[("0.21", "0.82")]) # note that the leading 0 is important here now
0    0.260015
1   -0.233822
Name: (0.21, 0.82), dtype: float64

【讨论】:

感谢最后一个。它也很有用。【参考方案2】:

考虑改用整数:将浮点数乘以 100(或 1000)并转换为整数:

df.index = pd.MultiIndex.from_product([
             (df.index.levels[0] * 100).astype(int),
             (df.index.levels[1] * 100).astype(int)])

与浮点数不同,整数是精确的。现在,您可以使用df.loc[(21, 82)] 访问您的数据。

【讨论】:

以上是关于pandas multiindex DataFrame中的圆形浮点数的主要内容,如果未能解决你的问题,请参考以下文章

Pandas:修改特定级别的 Multiindex

pandas中基于MultiIndex的索引[重复]

合并两个 pandas.core.indexes.multi.MultiIndex

合并 pandas MultiIndex 很慢

在 Pandas 中将两个 MultiIndex 级别合并为一个

Pandas:使用 MultiIndex 列按不同列聚合