重新索引仅适用于具有唯一值索引对象的解决方法

3

我看到很多关于这个错误的问题。我正在运行pandas '0.10.1'。

df = DataFrame({'A' : np.random.randn(5),
 'B' : np.random.randn(5),'C' : np.random.randn(5), 
  'D':['a','b','c','d','e'] })

#gives error
df.take([2,0,1,2,3], axis=1).drop(['C'],axis=1)

#works fine
df.take([2,0,1,2,1], axis=1).drop(['C'],axis=1)

我所能看到的是,在前一种情况下,我有一个非数字列,这似乎在某种程度上影响了索引,但以下命令返回空:

df.take([2,0,1,2,3], axis=1).index.get_duplicates()

重新索引错误毫无意义似乎不适用于我的旧索引是唯一的情况。

使用此命令 df.take([2,0,1,2,3], axis=1).index.get_duplicates(),从这篇文章中可以看出,我认为我的索引是唯一的:reindex数据帧的问题:仅在具有唯一值的索引对象上有效的重新索引

“仅在具有唯一值的索引对象上有效的重新索引”似乎不适用

我认为我的pandas版本#没问题,所以这个bug应该不是问题:pandas 仅在具有唯一值的索引对象上有效的重新索引


3
你正在处理这些“列”,很明显它们不是唯一的,因为按定义你正在处理重复项。你真正想做什么? - Jeff
你是正确的。但请注意,在两种情况下,取出后列不是唯一的,但在前一种情况下会返回错误,而在后一种情况下没有错误并返回正确的结果。我的实际用例与机器学习有关,我有一个表示N空间中M个特征向量的MxN矩阵。我想每隔10-15列重复分类列,这样当我滚动查看特征向量时就不会丢失分类信息。话虽如此,我希望能得到上述问题的解决方案/解释。 - Paul
1
可能是一个错误:https://github.com/pydata/pandas/issues/6240;通常要小心重复的列。您不应该仅为了查看内容而创建重复的列。 - Jeff
1个回答

9

首先,我相信您想要使用以下命令来测试重复项:

df.take([2,0,1,2,3],axis=1).columns.get_duplicates()

因为如果您使用索引而不是列,那么显然会返回一个空数组,因为随机浮点值不会重复。以上命令返回如预期的结果:

['C']

其次,我认为你是正确的,非数字列会导致错误,即使使用以下代码,仍然会出现错误:
df = DataFrame({'A' : np.random.randn(5), 'B' : np.random.randn(5),'C' :np.random.randn(5), 'D':[str(x) for x in np.random.randn(5) ]})

可能是一个错误,因为如果您查看名为“index.py”的核心文件,在第86行和第1228行,它所期望的类型分别是:

_engine_type = _index.ObjectEngine


_engine_type = _index.Int64Engine

如果您深入研究文档,就会发现这两者都不需要字符串。这是我所知道的最好答案,祝你好运!如果您解决了问题,请告诉我,因为我也很感兴趣。


2
是的,我认为你说得对。这可能与@Jeff在github上发布的错误报告有关:https://github.com/pydata/pandas/issues/6240 感谢您查看源代码并提供更好的最小工作示例。 - Paul

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