我是Python和Pandas的新手。
我有一个大型DataFrame
,我正在其中运行value_counts
来检查输出,如下所示:
df['Remaining'].value_counts().sort_index()
下面是输出,您可以看到50.0
出现了两次,一次6817
次,一次4次。我尝试在剩余df['Remaining'] == 50
时导出out来查看差异,但实际上没有差异。我做错什么了吗?
-225.0 2
-200.0 4
-150.0 14
-125.0 7
-100.0 346
-75.0 202
-50.0 1343
-25.0 527
0.0 61167
25.0 10467
50.0 6817
50.0 4
75.0 5358
100.0 3428
125.0 1626
150.0 598
175.0 334
200.0 223
225.0 102
250.0 69
275.0 13
350.0 1
375.0 4
400.0 3
425.0 2
Name: Remaining steps, dtype: int64
答案 0 :(得分:3)
没有您的数据,我会尽力猜测。我认为这是精度问题。您的2个不同的50.0
纸槽实际上可能具有不同的精度点值,并且打印输出未显示该值。让我们尝试一下这个示例
df = pd.DataFrame({'num': [-12.5, 50.00000000004, 50.0, -25.10, 50.0]} , dtype=float)
print(df)
In [23]:
num
0 -12.5
1 50.0
2 50.0
3 -25.1
4 50.0
打印仅显示取整值。让我们尝试value_counts
。它显示2个与您的问题相同的50.0
垃圾箱
df.num.value_counts().sort_index()
Out[27]:
-25.1 1
-12.5 1
50.0 2
50.0 1
Name: num, dtype: int64
让我们在round
之前尝试value_counts
df.num.round(2).value_counts().sort_index()
Out[28]:
-25.1 1
-12.5 1
50.0 3
Name: num, dtype: int64
因此,我想您可能在上述系列的round
之前先致电value_counts
,以查看其是否已解决。
答案 1 :(得分:0)
我可以自由使用@Andy L的示例数据框。
实现这一目标的一种快速肮脏的方法是。
>>> df = pd.DataFrame({'num': [-12.5, 50.00000000004, 50.0, -25.10, 50.0]} , dtype=float)
>>> df
num
0 -12.5
1 50.0
2 50.0
3 -25.1
4 50.0
>>> df['num'].astype(str).value_counts()
50.0 3
-25.1 1
-12.5 1
Name: num, dtype: int64
如果它看起来是一个精度问题,则可以尝试设置。
正如我们在数据帧结构中看到的,50
的精度点有所递减,在这里我们可以看到初始50.0
的浮点精度发生两次,而另外一次则为50.00000000004
,因此value_counts()
将它们隔离为一个单独的bin。
>>> df.num.value_counts().keys()
Float64Index([50.0, -25.1, 50.00000000004, -12.5], dtype='float64')
正如我所说,所以我们可以设置要计数的精度点,如下所示。
>>> pd.set_option('precision', 0)
OR
>>> df['num'].map('{:,.2f}'.format).value_counts()
50.00 3
-12.50 1
-25.10 1
Name: num, dtype: int64
您可以看到熊猫开发人员@jeff From this SO thread about float precision
的解释。希望这会有所帮助。