2014-12-01 139 views
82

当我尝试将索引设置为某个值时,我得到ValueError: cannot reindex from a duplicate axis。我试图用一个简单的例子重现这一点,但我无法做到。ValueError:不能从重复轴重新索引是什么意思?

这里是我的会话里面的ipdb跟踪。我有一个DataFrame的字符串索引,以及整数列,浮点值。但是,当我尝试创建sum索引所有列的总和我得到ValueError: cannot reindex from a duplicate axis错误。我创建了一个具有相同特性的小型DataFrame,但无法重现该问题,我可能会丢失什么?

我真的不明白ValueError: cannot reindex from a duplicate axis是什么意思,这个错误信息是什么意思?也许这会帮助我诊断问题,这是我的问题中最可回答的部分。

ipdb> type(affinity_matrix) 
<class 'pandas.core.frame.DataFrame'> 
ipdb> affinity_matrix.shape 
(333, 10) 
ipdb> affinity_matrix.columns 
Int64Index([9315684, 9315597, 9316591, 9320520, 9321163, 9320615, 9321187, 9319487, 9319467, 9320484], dtype='int64') 
ipdb> affinity_matrix.index 
Index([u'001', u'002', u'003', u'004', u'005', u'008', u'009', u'010', u'011', u'014', u'015', u'016', u'018', u'020', u'021', u'022', u'024', u'025', u'026', u'027', u'028', u'029', u'030', u'032', u'033', u'034', u'035', u'036', u'039', u'040', u'041', u'042', u'043', u'044', u'045', u'047', u'047', u'048', u'050', u'053', u'054', u'055', u'056', u'057', u'058', u'059', u'060', u'061', u'062', u'063', u'065', u'067', u'068', u'069', u'070', u'071', u'072', u'073', u'074', u'075', u'076', u'077', u'078', u'080', u'082', u'083', u'084', u'085', u'086', u'089', u'090', u'091', u'092', u'093', u'094', u'095', u'096', u'097', u'098', u'100', u'101', u'103', u'104', u'105', u'106', u'107', u'108', u'109', u'110', u'111', u'112', u'113', u'114', u'115', u'116', u'117', u'118', u'119', u'121', u'122', ...], dtype='object') 

ipdb> affinity_matrix.values.dtype 
dtype('float64') 
ipdb> 'sums' in affinity_matrix.index 
False 

以下是错误:

ipdb> affinity_matrix.loc['sums'] = affinity_matrix.sum(axis=0) 
*** ValueError: cannot reindex from a duplicate axis 

我试图用一个简单的例子来重现这一点,但我失败了

In [32]: import pandas as pd 

In [33]: import numpy as np 

In [34]: a = np.arange(35).reshape(5,7) 

In [35]: df = pd.DataFrame(a, ['x', 'y', 'u', 'z', 'w'], range(10, 17)) 

In [36]: df.values.dtype 
Out[36]: dtype('int64') 

In [37]: df.loc['sums'] = df.sum(axis=0) 

In [38]: df 
Out[38]: 
     10 11 12 13 14 15 16 
x  0 1 2 3 4 5 6 
y  7 8 9 10 11 12 13 
u  14 15 16 17 18 19 20 
z  21 22 23 24 25 26 27 
w  28 29 30 31 32 33 34 
sums 70 75 80 85 90 95 100 
+1

是否有机会混淆亲和矩阵的真实列名称? (即用其他东西替换真实值来隐藏敏感信息) – Korem 2014-12-01 20:12:08

+0

@Korem,我不认为这是真的,但即使这是真的,为什么会导致上述错误? – Akavall 2014-12-01 21:10:36

+2

我通常在分配的索引具有重复值时看到此情况。由于你的情况你正在分配一个行,我预计在列名中有重复。这就是我问的原因。 – Korem 2014-12-01 21:11:49

回答

61

这个错误通常会上升,当你加入/分配到当索引有重复值时。由于您正在分配到一行,因此我怀疑affinity_matrix.columns中存在重复值,可能未在您的问题中显示。

+9

为了更准确,在我的情况下重复的值在'affinity_matrix.index'中,但我认为这是相同的概念。 – Akavall 2014-12-02 06:36:54

62

正如其他人所说,您的原始索引中可能有重复的值。要找到他们做到这一点:如果你创建通过连接其它DataFrames一个数据帧经常出现

df[df.index.duplicated()]

6

指数与重复的值。如果您不关心保留索引值,并且希望它们是唯一值,那么在连接数据时,请设置ignore_index=False

或者,用一个新的覆盖您当前的指数,而不是使用df.reindex(),设置:

df.index = new_index 
0

就我而言,我曾与

0

我遇到了相同名称的重复列今天这个错误,当我想添加一个新列这样

df_temp['REMARK_TYPE'] = df.REMARK.apply(lambda v: 1 if str(v)!='nan' else 0) 

我想要处理的的REMARK列返回1或0.但是我输入了错误的变量df。它返回的错误是这样的:

----> 1 df_temp['REMARK_TYPE'] = df.REMARK.apply(lambda v: 1 if str(v)!='nan' else 0) 

/usr/lib64/python2.7/site-packages/pandas/core/frame.pyc in __setitem__(self, key, value) 
    2417   else: 
    2418    # set column 
-> 2419    self._set_item(key, value) 
    2420 
    2421  def _setitem_slice(self, key, value): 

/usr/lib64/python2.7/site-packages/pandas/core/frame.pyc in _set_item(self, key, value) 
    2483 
    2484   self._ensure_valid_index(value) 
-> 2485   value = self._sanitize_column(key, value) 
    2486   NDFrame._set_item(self, key, value) 
    2487 

/usr/lib64/python2.7/site-packages/pandas/core/frame.pyc in _sanitize_column(self, key, value, broadcast) 
    2633 
    2634   if isinstance(value, Series): 
-> 2635    value = reindexer(value) 
    2636 
    2637   elif isinstance(value, DataFrame): 

/usr/lib64/python2.7/site-packages/pandas/core/frame.pyc in reindexer(value) 
    2625      # duplicate axis 
    2626      if not value.index.is_unique: 
-> 2627       raise e 
    2628 
    2629      # other 

ValueError: cannot reindex from a duplicate axis 

正如你可以看到它,正确的代码应该是

df_temp['REMARK_TYPE'] = df_temp.REMARK.apply(lambda v: 1 if str(v)!='nan' else 0) 

因为dfdf_temp有不同的行数。所以它返回ValueError: cannot reindex from a duplicate axis

希望你能理解它,我的回答可以帮助其他人调试他们的代码。