507 Stimmen

Was bedeutet "ValueError: cannot reindex from a duplicate axis"?

Ich bekomme einen ValueError: cannot reindex from a duplicate axis, wenn ich versuche, einen Index auf einen bestimmten Wert zu setzen. Ich habe versucht, dies mit einem einfachen Beispiel zu reproduzieren, aber es ist mir nicht gelungen.

Hier ist meine Sitzung innerhalb der ipdb Spur. Ich habe ein DataFrame mit einem String-Index und ganzzahligen Spalten sowie Gleitkommawerten. Wenn ich jedoch versuche, einen sum-Index für die Summe aller Spalten zu erstellen, erhalte ich einen ValueError: cannot reindex from a duplicate axis Fehler. Ich habe ein kleines DataFrame mit den gleichen Merkmalen erstellt, konnte das Problem jedoch nicht reproduzieren. Was könnte mir entgehen?

Ich verstehe nicht wirklich, was ValueError: cannot reindex from a duplicate axis bedeutet, was bedeutet diese Fehlermeldung? Vielleicht hilft mir das bei der Diagnose des Problems, und dies ist der am meisten zu beantwortende Teil meiner Frage.

ipdb> type(affinity_matrix)

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

Hier ist der Fehler:

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

Ich habe versucht, dies mit einem einfachen Beispiel zu reproduzieren, aber ich bin gescheitert

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

328voto

Korem Punkte 11116

Dieser Fehler tritt normalerweise auf, wenn Sie sich einer Spalte zuweisen, wenn der Index doppelte Werte aufweist. Da Sie sich einer Zeile zuweisen, vermute ich, dass ein doppelter Wert in affinity_matrix.columns vorliegt, der in Ihrer Frage möglicherweise nicht angezeigt wird.

263voto

Matthew Punkte 8766

Wie andere gesagt haben, haben Sie wahrscheinlich doppelte Werte in Ihrem originalen Index. Um diese zu finden, tun Sie dies:

df[df.index.duplicated()]

71voto

Rebeku Punkte 859

Indizes mit doppelten Werten entstehen oft, wenn Sie ein DataFrame durch Konkatenieren anderer DataFrames erstellen. Wenn es Ihnen nicht wichtig ist, die Werte Ihres Index beizubehalten und sie eindeutig sein sollen, wenn Sie die Daten verknüpfen,ignore_index=True.

Alternativ, um Ihren aktuellen Index durch einen neuen zu überschreiben, verwenden Sie anstelle von df.reindex(), setzen Sie:

df.index = new_index

54voto

Connor Punkte 3095

Einfache Lösung

Führen Sie dies aus, bevor Sie gruppieren

df = df.reset_index()

Danke an diesen GitHub-Kommentar für die Lösung.

43voto

Parseltongue Punkte 10405

Für Personen, die immer noch mit diesem Fehler kämpfen, kann dies auch passieren, wenn Sie versehentlich eine doppelte Spalte mit dem gleichen Namen erstellen. Entfernen Sie doppelte Spalten wie folgt:

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

CodeJaeger.com

CodeJaeger ist eine Gemeinschaft für Programmierer, die täglich Hilfe erhalten..
Wir haben viele Inhalte, und Sie können auch Ihre eigenen Fragen stellen oder die Fragen anderer Leute lösen.

Powered by:

X