Ik krijg een ValueError: cannot reindex from a duplicate axis
wanneer ik een index probeer in te stellen op een bepaalde waarde. Ik heb geprobeerd dit te reproduceren met een eenvoudig voorbeeld, maar het lukte niet.
Hier is mijn sessie in ipdb
trace. Ik heb een DataFrame met string-index en integer-kolommen, float-waarden. Wanneer ik echter een sum
-index probeer te maken voor de som van alle kolommen, krijg ik de fout ValueError: cannot reindex from a duplicate axis
-fout. Ik heb een klein DataFrame gemaakt met dezelfde kenmerken, maar ik kon het probleem niet reproduceren, wat zou ik kunnen missen?
Ik begrijp niet echt wat ValueError: cannot reindex from a duplicate axis
betekent, wat betekent deze foutmelding? Misschien kan dit me helpen het probleem te diagnosticeren, en dit is het meest beantwoordbare deel van mijn vraag.
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
Dit is de fout:
ipdb> affinity_matrix.loc['sums'] = affinity_matrix.sum(axis=0)
*** ValueError: cannot reindex from a duplicate axis
Ik heb geprobeerd dit te reproduceren met een eenvoudig voorbeeld, maar ik heb gefaald
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
Antwoord 1, autoriteit 100%
Deze fout treedt meestal op wanneer u een kolom samenvoegt / toewijst wanneer de index dubbele waarden heeft. Aangezien je een rij toewijst, vermoed ik dat er een dubbele waarde is in affinity_matrix.columns
, die misschien niet wordt weergegeven in je vraag.
Antwoord 2, autoriteit 82%
Zoals anderen al hebben gezegd, heeft u waarschijnlijk dubbele waarden in uw oorspronkelijke index. Ga als volgt te werk om ze te vinden:
df[df.index.duplicated()]
Antwoord 3, autoriteit 19%
Indices met dubbele waarden ontstaan vaak als u een DataFrame maakt door andere DataFrames samen te voegen. ALS u de waarden van uw index niet wilt behouden en u wilt dat ze unieke waarden zijn, stelt u ignore_index=True
in wanneer u de gegevens samenvoegt.
Als alternatief, om uw huidige index te overschrijven door een nieuwe, in plaats van df.reindex()
te gebruiken, stelt u het volgende in:
df.index = new_index
Antwoord 4, autoriteit 13%
Voor mensen die nog steeds worstelen met deze fout: het kan ook gebeuren als u per ongeluk een dubbele kolom met dezelfde naam maakt. Verwijder dubbele kolommen als volgt:
df = df.loc[:,~df.columns.duplicated()]
Antwoord 5, autoriteit 7%
Sla de fout gewoon over met .values
aan het einde.
affinity_matrix.loc['sums'] = affinity_matrix.sum(axis=0).values
Antwoord 6, autoriteit 4%
Ik kwam deze fout vandaag tegen toen ik een nieuwe kolom als deze wilde toevoegen
df_temp['REMARK_TYPE'] = df.REMARK.apply(lambda v: 1 if str(v)!='nan' else 0)
Ik wilde de kolom REMARK
van df_temp
verwerken om 1 of 0 terug te geven. Ik heb echter een verkeerde variabele getypt met df
. En het gaf een foutmelding als deze:
----> 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
Zoals je kunt zien, zou de juiste code moeten zijn
df_temp['REMARK_TYPE'] = df_temp.REMARK.apply(lambda v: 1 if str(v)!='nan' else 0)
Omdat df
en df_temp
een ander aantal rijen hebben. Dus het retourneerde ValueError: cannot reindex from a duplicate axis
.
Ik hoop dat je het begrijpt en dat mijn antwoord andere mensen kan helpen bij het debuggen van hun code.
Antwoord 7, autoriteit 4%
Eenvoudige oplossing
Probeer dit uit te voeren voordat u gaat groeperen
df.reset_index(inplace=True)
Bedankt aan deze github-opmerking voor de oplossing .
Verwijder inplace=True
als u wilt dat het dataframe wordt geretourneerd.
Antwoord 8, autoriteit 2%
In mijn geval deed deze fout zich niet voor vanwege dubbele waarden, maar omdat ik probeerde een kortere serie aan een dataframe te koppelen: beide hadden dezelfde index, maar de serie had minder rijen (de bovenste paar ontbraken). Het volgende werkte voor mijn doeleinden:
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
Antwoord 9
Ik heb een paar uur verspild aan hetzelfde probleem. In mijn geval moest ik reset_index() van een dataframe voordat ik de toepassingsfunctie gebruikte.
Voordat u samenvoegt of opkijkt vanuit een andere geïndexeerde dataset, moet u de index opnieuw instellen, aangezien 1 dataset slechts 1 index kan hebben.
Antwoord 10
Ik kreeg deze foutmelding toen ik probeerde een kolom uit een andere tabel toe te voegen. Inderdaad kreeg ik onderweg dubbele indexwaarden. Maar het bleek dat ik het gewoon verkeerd deed: ik moest eigenlijk df.join
de andere tabel.
Deze aanwijzer kan iemand in een vergelijkbare situatie helpen.
Antwoord 11
Dit kan hier ook de oorzaak van zijn[:) Ik heb mijn probleem zo opgelost]
Het kan zelfs gebeuren als u een kolom van het type dataframe in een dataframe probeert in te voegen
u kunt dit proberen
df['my_new']=pd.Series(my_new.values)
Antwoord 12
Als je deze foutmelding krijgt na het samenvoegen van twee dataframes en het verwijderen van het achtervoegsel en probeer te schrijven naar Excel
Uw probleem is dat er kolommen zijn die u niet samenvoegt die gemeenschappelijk zijn voor beide brongegevensframes. Panda’s hebben een manier nodig om te zeggen welke waar vandaan komt, dus het voegt de achtervoegsels toe, de standaardwaarden zijn ‘_x’ aan de linkerkant en ‘_y’ aan de rechterkant.
Als u een voorkeur heeft voor welk brongegevensframe de kolommen moeten worden bewaard, kunt u de achtervoegsels instellen en dienovereenkomstig filteren, bijvoorbeeld als u de conflicterende kolommen van links wilt behouden:
# Label the two sides, with no suffix on the side you want to keep
df = pd.merge(
df,
tempdf[what_i_care_about],
on=['myid', 'myorder'],
how='outer',
suffixes=('', '_delete_suffix') # Left gets no suffix, right gets something identifiable
)
# Discard the columns that acquired a suffix
df = df[[c for c in df.columns if not c.endswith('_delete_suffix')]]
U kunt ook een van elk van de botsende kolommen verwijderen voordat u ze samenvoegt, dan hoeft Pandas geen achtervoegsel toe te wijzen.