擅长:python、mysql、java
<p><strong>问题是</strong>pandas.qcut选择存储箱,以便在每个存储箱/分位数中具有相同数量的记录,但具有相同值的记录不能放入不同的存储箱/分位数。</p>
<p><strong>解决方案是:</p>
<p><strong>1-使用pandas>;=0.20.0</strong>具有<a href="http://github.com/pandas-dev/pandas/pull/15000" rel="nofollow noreferrer">this fix</a>。他们添加了一个选项<code>duplicates='raise'|'drop'</code>来控制是在重复的边上提升还是丢弃它们,这将导致比指定的更少的存储箱,以及一些比其他存储箱更大(包含更多元素)的存储箱。</p>
<p><strong>2-使用pandas.cut</strong>根据值本身选择要均匀分布的存储箱,而pandas.qcut选择存储箱,以便每个存储箱中的记录数相同</p>
<p><strong>3-</strong><strong>减少<strong>分位数的数量。更少的分位数意味着每个分位数有更多的元素</p>
<p><strong>4-</strong>指定自定义分位数范围,例如[0、.50、.75、1.]以获得每个分位数不相等的项数</p>
<p><strong>5-用DataFrame.Rank(method='first')对数据进行排序。排名为数据帧中的每个元素(排名)分配一个唯一的值,同时保持元素的顺序(除了相同的值,这些值将按照它们在数组中的出现顺序排列,请参见method='first')。这解决了这个问题,但您可能有相同的(预排序)值进入不同的分位数,这可能是正确的或不取决于您的意图。</p>
<p>示例:</p>
<pre><code>pd.qcut(df, nbins) <-- this generates "ValueError: Bin edges must be unique"
</code></pre>
<p>然后改用这个:</p>
<pre><code>pd.qcut(df.rank(method='first'), nbins)
</code></pre>