2014-12-01 132 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

希望你能理解它,我的回答可以幫助其他人調試他們的代碼。

相關問題