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
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.
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()]
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
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()]
Utilisez simplement le .values
à la fin.
affinity_matrix.loc['sums'] = affinity_matrix.sum(axis=0).values
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.
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