Dostaję, ValueError: cannot reindex from a duplicate axis
gdy próbuję ustawić indeks do określonej wartości. Próbowałem to odtworzyć na prostym przykładzie, ale nie mogłem tego zrobić.
Oto moja sesja wewnątrz ipdb
śledzenia. Mam DataFrame z indeksem ciągów i kolumnami liczb całkowitych, wartościami zmiennoprzecinkowymi. Jednak gdy próbuję utworzyć sum
indeks sumy wszystkich kolumn, pojawia się ValueError: cannot reindex from a duplicate axis
błąd. Stworzyłem małą ramkę DataFrame o tych samych cechach, ale nie byłem w stanie odtworzyć problemu, czego mógłbym brakować?
Naprawdę nie rozumiem, co to ValueError: cannot reindex from a duplicate axis
znaczy, co oznacza ten komunikat o błędzie? Może to pomoże mi zdiagnozować problem, i to jest najbardziej odpowiedzialna część mojego pytania.
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
Oto błąd:
ipdb> affinity_matrix.loc['sums'] = affinity_matrix.sum(axis=0)
*** ValueError: cannot reindex from a duplicate axis
Próbowałem to odtworzyć na prostym przykładzie, ale mi się nie udało
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
Odpowiedzi:
Ten błąd zwykle pojawia się po dołączeniu / przypisaniu do kolumny, gdy indeks ma zduplikowane wartości. Ponieważ przypisujesz do wiersza, podejrzewam, że istnieje zduplikowana wartość w
affinity_matrix.columns
, być może nie pokazana w twoim pytaniu.źródło
affinity_matrix.index
, ale myślę, że to ta sama koncepcja.index
oznacza zarównorow
icolumn names
spędziłem 20 minut na indeksie wierszy, ale okazało się, że mam zduplikowane nazwy kolumn, które spowodowały ten błąd.Jak powiedzieli inni, prawdopodobnie masz oryginalne wartości w oryginalnym indeksie. Aby je znaleźć:
df[df.index.duplicated()]
źródło
df = df[~df.index.duplicated()]
DatetimeIndex
dataframes ed możnaresample
do żądanej częstotliwości, a następnie podjąć.first()
,.mean()
itpWskaźniki ze zduplikowanymi wartościami często powstają, jeśli utworzysz ramkę danych przez połączenie innych ramek danych. JEŻELI nie zależy Ci na zachowaniu wartości indeksu i chcesz, aby były one unikatowymi wartościami, po połączeniu danych ustaw
ignore_index=True
.Alternatywnie, aby zastąpić bieżący indeks nowym, zamiast używać
df.reindex()
, ustaw:źródło
ignore_index=False
jest domyślny; jeśli skorzystanie z tej opcjiappend
w ogóle zmieni zachowanie, będzie musiało tak być, ponieważ ustawiłeś ją naTrue
.W przypadku osób, które nadal borykają się z tym błędem, może się to również zdarzyć, jeśli przypadkowo utworzysz zduplikowaną kolumnę o tej samej nazwie. Usuń zduplikowane kolumny w taki sposób:
źródło
Po prostu pomiń błąd, używając
.values
na końcu.źródło
.values
zrobiło lewęTen błąd napotkałem dzisiaj, gdy chciałem dodać nową kolumnę w ten sposób
Chciałem przetworzyć
REMARK
kolumnędf_temp
zwracającą 1 lub 0. Jednak wpisałem niepoprawną zmienną za pomocądf
. I zwrócił błąd w następujący sposób:Jak widać, właściwym kodem powinien być
Ponieważ
df
idf_temp
mają inną liczbę wierszy. Więc wróciłoValueError: cannot reindex from a duplicate axis
.Mam nadzieję, że to zrozumiesz, a moja odpowiedź może pomóc innym osobom w debugowaniu ich kodu.
źródło
W moim przypadku ten błąd pojawił się nie z powodu zduplikowanych wartości, ale dlatego, że próbowałem dołączyć krótszą serię do ramki danych: oba miały ten sam indeks, ale seria miała mniej wierszy (brak kilku pierwszych). Do moich celów zadziałały:
źródło
df_larger_dataframe['values'] = df_filtered_dataframe['filtered_values']
ostatnio nie działało na TimeSeries - twój kod to rozwiązał!Zmarnowałem kilka godzin na ten sam problem. W moim przypadku musiałem zresetować ramkę danych przed użyciem funkcji wprowadzania. Przed scaleniem lub wyszukaniem z innego zindeksowanego zestawu danych należy zresetować indeks, ponieważ 1 zestaw danych może mieć tylko 1 indeks.
źródło
Prosta poprawka, która zadziałała dla mnie
Uruchom
df.reset_index(inplace=True)
przed zgrupowaniem.Dziękuję za komentarz github dotyczący rozwiązania.
źródło