Wat betekent `ValueError: kan niet opnieuw indexeren vanaf een dubbele as`?

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 axisbetekent, 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.

LEAVE A REPLY

Please enter your comment!
Please enter your name here

Other episodes