web-dev-qa-db-fra.com

Que signifie `ValueError: impossible de réindexer à partir d'un axe dupliqué`?

Je reçois un ValueError: cannot reindex from a duplicate axis lorsque j'essaie de définir un index à une certaine valeur. J'ai essayé de reproduire cela avec un exemple simple, mais je ne pouvais pas le faire.

Voici ma session à l'intérieur de ipdb trace. J'ai un DataFrame avec un index de chaîne, et des colonnes entières, des valeurs flottantes. Cependant, lorsque j'essaie de créer sum index pour la somme de toutes les colonnes, l'erreur ValueError: cannot reindex from a duplicate axis s'affiche. J'ai créé un petit DataFrame avec les mêmes caractéristiques, mais je n'ai pas pu reproduire le problème. Que pourrais-je manquer?

Je ne comprends pas vraiment ce que ValueError: cannot reindex from a duplicate axis signifie, que signifie ce message d'erreur? Cela m'aidera peut-être à diagnostiquer le problème, et ceci est la partie la plus responsable de ma question.

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

Voici l'erreur:

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

J'ai essayé de reproduire cela avec un exemple simple, mais j'ai échoué.

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
185
Akavall

Cette erreur survient généralement lorsque vous rejoignez/assignez une colonne lorsque l'index contient des valeurs en double. Étant donné que vous attribuez une ligne, je soupçonne qu’il existe une valeur en double dans affinity_matrix.columns, qui n’est peut-être pas indiquée dans votre question.

126
Korem

Comme d'autres l'ont dit, votre index d'origine contient probablement des valeurs en double. Pour les trouver, faites ceci:

df[df.index.duplicated()]

121
Matthew

Les index avec des valeurs en double apparaissent souvent si vous créez un DataFrame en concaténant d'autres DataFrames. SI vous ne vous souciez pas de préserver les valeurs de votre index et que vous voulez que ces valeurs soient uniques, lorsque vous concaténez les données, définissez ignore_index=False.

Sinon, pour remplacer votre index actuel par un nouvel index, au lieu d'utiliser df.reindex(), définissez:

df.index = new_index
21
Rebeku

Pour les personnes qui rencontrent encore des problèmes avec cette erreur, cela peut également se produire si vous créez accidentellement une colonne dupliquée portant le même nom. Supprimez les colonnes en double comme suit:

df = df.loc[:,~df.columns.duplicated()]
9
Parseltongue

Utilisez simplement le .values à la fin.

affinity_matrix.loc['sums'] = affinity_matrix.sum(axis=0).values
7
Hadij

Je suis tombé sur cette erreur aujourd'hui quand je voulais ajouter une nouvelle colonne comme celle-ci

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

Je voulais traiter la colonne REMARK de df_temp pour renvoyer 1 ou 0. Cependant, j'ai saisi une variable incorrecte avec df. Et cela a renvoyé une erreur comme ceci:

----> 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

Comme vous pouvez le voir, le bon code devrait être

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

Parce que df et df_temp ont un nombre différent de lignes. Donc, il est retourné ValueError: cannot reindex from a duplicate axis.

J'espère que vous pourrez le comprendre et que ma réponse pourra aider d'autres personnes à déboguer leur code.

7
GoingMyWay

Dans mon cas, cette erreur est apparue non pas à cause de valeurs en double, mais parce que j'ai tenté de joindre une série plus courte à une image de données: les deux avaient le même index, mais la série contenait moins de lignes (il manquait les premières). Ce qui suit a fonctionné pour mes besoins:

df.head()
                          SensA
date                           
2018-04-03 13:54:47.274   -0.45
2018-04-03 13:55:46.484   -0.42
2018-04-03 13:56:56.235   -0.37
2018-04-03 13:57:57.207   -0.34
2018-04-03 13:59:34.636   -0.33

series.head()
date
2018-04-03 14:09:36.577    62.2
2018-04-03 14:10:28.138    63.5
2018-04-03 14:11:27.400    63.1
2018-04-03 14:12:39.623    62.6
2018-04-03 14:13:27.310    62.5
Name: SensA_rrT, dtype: float64

df = series.to_frame().combine_first(df)

df.head(10)
                          SensA  SensA_rrT
date                           
2018-04-03 13:54:47.274   -0.45        NaN
2018-04-03 13:55:46.484   -0.42        NaN
2018-04-03 13:56:56.235   -0.37        NaN
2018-04-03 13:57:57.207   -0.34        NaN
2018-04-03 13:59:34.636   -0.33        NaN
2018-04-03 14:00:34.565   -0.33        NaN
2018-04-03 14:01:19.994   -0.37        NaN
2018-04-03 14:02:29.636   -0.34        NaN
2018-04-03 14:03:31.599   -0.32        NaN
2018-04-03 14:04:30.779   -0.33        NaN
2018-04-03 14:05:31.733   -0.35        NaN
2018-04-03 14:06:33.290   -0.38        NaN
2018-04-03 14:07:37.459   -0.39        NaN
2018-04-03 14:08:36.361   -0.36        NaN
2018-04-03 14:09:36.577   -0.37       62.2
3
tehfink