pandas Series.value_counts()的奇怪行为

5

我有一个包含数字数据的Pandas Series,我想找到它的唯一值以及它们的频率出现。我使用标准程序

# Given the my_data is a column of a pd.Dataframe df
unique = df[my_data].value_counts() 
print unique

这里是我得到的结果

# -------------------OUTPUT
-0.010000    46483 
-0.010000    16895
-0.027497    12215
-0.294492    11915
 0.027497    11397

我不理解的是为什么值为“相同值”(-0.01)会出现两次。这是内部阈值(小值),还是我做错了什么?
更新: 如果我将数据框存储在csv中并重新读取,则会获得正确的结果,即:
#-------------------输出 -0.010000 63378 -0.027497 12215 -0.294492 11915 0.027497 11397
解决方法: 基于讨论,我找到了问题的来源和解决办法。正如提到的那样,这是浮点精度问题,可以通过四舍五入来解决值的问题。但是,如果没有……我就看不出来。
pd.set_option('display.float_format', repr)

非常感谢您的帮助!!

数据框 df 的样子是什么?它的精度是否比这里显示的更高? - harvpan
是的,它具有更高的精度,但即使我四舍五入,输出也不会改变。 - dthed
在这种情况下,请参考 [MCVE] 提供示例数据。 - harvpan
2
@dthed:你能解释一下为什么不可能吗?你只需要反复缩小数据集,直到找到一个最小的数据集,展现出这种行为。例如,如果你只取现有数据集的前一半,会发生什么?那么再取前一半呢?以此类推。 - Mark Dickinson
1
@dthed: 没关系。你已经有了数据集。你可以按照我描述的方式缩小它(无需每次重新生成)。一旦你有了一个最小数据集,就做一个 pd.set_option('display.float_format', repr) 然后打印出这个最小数据集,编辑结果到这个问题中。我们不需要所有的代码。 - Mark Dickinson
显示剩余3条评论
1个回答

6

我认为这是一个类似于以下问题的浮点精度问题:

In [1]: 0.1 + 0.2
Out[1]: 0.30000000000000004

In [2]: 0.1 + 0.2 == 0.3
Out[2]: False

那么请试试这个:
df[my_data].round(6).value_counts() 

更新:

演示:

In [14]: s = pd.Series([-0.01, -0.01, -0.01000000000123, 0.2])

In [15]: s
Out[15]:
0   -0.01
1   -0.01
2   -0.01
3    0.20
dtype: float64

In [16]: s.value_counts()
Out[16]:
-0.01    2
-0.01    1
 0.20    1
dtype: int64

In [17]: s.round(6).value_counts()
Out[17]:
-0.01    3
 0.20    1
dtype: int64

这是我的第一个想法,但即使我四舍五入数值,也没有任何变化。 - dthed
@dthed,在这种情况下,我们需要一个小的__可重现__数据集才能帮助您... - MaxU - stand with Ukraine
创建一个MCV是不可能的。如果你有时间,请查看我的更新。似乎浮点精度确实起了作用,但无法通过舍入来解决。 - dthed
1
@dthed,如果没有可重现的样本数据集,我想我无法提供帮助。请检查更新的答案-在那里我复制了您的问题并进行了四舍五入处理... - MaxU - stand with Ukraine
1
感谢您提供的示例和您的时间! - dthed

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