<p>如果我复制粘贴到你的数据中,我会得到:</p>
<pre><code>>>> df
0 1
0 1.000000 1.000000
1 1.122733 1.153222
2 0.941207 0.778028
3 0.843013 0.916605
4 0.930963 1.213833
5 0.843013 0.916605
6 0.755064 1.079864
>>> df.drop_duplicates()
0 1
0 1.000000 1.000000
1 1.122733 1.153222
2 0.941207 0.778028
3 0.843013 0.916605
4 0.930963 1.213833
6 0.755064 1.079864
</code></pre>
<p>所以它实际上被删除了,你的问题是数组并没有完全的相等(尽管它们的差舍入到0来显示)。</p>
<p>一种解决方法是用<code>df.apply(np.round, args=[4])</code>这样的方法将数据舍入到任意多个小数位,然后删除重复项。如果希望保留原始数据,但删除重复到舍入的行,可以使用</p>
<pre><code>df = df.ix[~df.apply(np.round, args=[4]).duplicated()]
</code></pre>
<hr/>
<p>这里有一个非常笨拙的方法来实现您的要求:将几乎相等的值设置为实际相等:</p>
<pre><code>grouped = df.groupby([df[i].round(4) for i in df.columns])
subbed = grouped.apply(lambda g: g.apply(lambda row: g.irow(0), axis=1))
subbed.drop_index(level=list(df.columns), drop=True, inplace=True)
</code></pre>
<p>这将重新排序数据帧,但如果需要,您可以调用<code>.sort()</code>将它们恢复为原始顺序。</p>
<p>说明:第一行使用<a href="http://pandas.pydata.org/pandas-docs/dev/groupby.html" rel="noreferrer">^{<cd3>}</a>按舍入值对数据帧进行分组。不幸的是,如果你给groupby一个函数,它会把它应用到标签而不是行(所以你可以做<code>df.groupby(lambda k: np.round(df.ix[k], 4))</code>,但这也很糟糕)。</p>
<p>第二行使用groupby上的<code>apply</code>方法将几乎重复行的数据帧<code>g</code>替换为新的数据帧<code>g.apply(lambda row: g.irow(0), axis=1)</code>。使用dataframes上的<code>apply</code>方法将每一行替换为组的第一行。</p>
<p>结果看起来</p>
<pre><code> 0 1
0 1
0.7551 1.0799 6 0.755064 1.079864
0.8430 0.9166 3 0.843013 0.916605
5 0.843013 0.916605
0.9310 1.2138 4 0.930963 1.213833
0.9412 0.7780 2 0.941207 0.778028
1.0000 1.0000 0 1.000000 1.000000
1.1227 1.1532 1 1.122733 1.153222
</code></pre>
<p>其中<code>groupby</code>插入了舍入值作为索引。然后<code>reset_index</code>行删除这些列。</p>
<p>希望比我更了解熊猫的人能来看看如何做得更好。</p>