Saya mendapatkan ValueError: cannot reindex from a duplicate axis
ketika saya mencoba untuk menetapkan indeks ke nilai tertentu. Saya mencoba mereproduksi ini dengan contoh sederhana, tetapi saya tidak bisa melakukannya.
Inilah sesi saya di dalam ipdb
jejak. Saya memiliki DataFrame dengan indeks string, dan kolom integer, nilai float. Namun ketika saya mencoba membuat sum
indeks untuk jumlah semua kolom saya mendapatkan ValueError: cannot reindex from a duplicate axis
kesalahan. Saya membuat DataFrame kecil dengan karakteristik yang sama, tetapi tidak dapat mereproduksi masalah, apa yang bisa saya lewatkan?
Saya tidak benar-benar mengerti apa ValueError: cannot reindex from a duplicate axis
artinya, apa artinya pesan kesalahan ini? Mungkin ini akan membantu saya mendiagnosis masalahnya, dan ini adalah bagian yang paling bisa dijawab dari pertanyaan saya.
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
Inilah kesalahannya:
ipdb> affinity_matrix.loc['sums'] = affinity_matrix.sum(axis=0)
*** ValueError: cannot reindex from a duplicate axis
Saya mencoba mereproduksi ini dengan contoh sederhana, tetapi saya gagal
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
Jawaban:
Kesalahan ini biasanya naik ketika Anda bergabung / menetapkan ke kolom ketika indeks memiliki nilai duplikat. Karena Anda menugaskan untuk baris, saya menduga bahwa ada nilai duplikat di
affinity_matrix.columns
, mungkin tidak ditampilkan dalam pertanyaan Anda.sumber
affinity_matrix.index
, tapi saya pikir ini adalah konsep yang sama.index
berarti keduanyarow
dancolumn names
, menghabiskan 20 menit pada indeks baris tetapi ternyata saya mendapat nama kolom duplikat yang menyebabkan kesalahan ini.Seperti yang orang lain katakan, Anda mungkin memiliki nilai duplikat di indeks asli Anda. Untuk menemukannya lakukan ini:
df[df.index.duplicated()]
sumber
df = df[~df.index.duplicated()]
DatetimeIndex
dataframes ed, Anda dapatresample
dengan frekuensi yang diinginkan dan kemudian mengambil.first()
,.mean()
, dllIndeks dengan nilai duplikat sering muncul jika Anda membuat DataFrame dengan menggabungkan DataFrame lainnya. JIKA Anda tidak peduli tentang menjaga nilai-nilai indeks Anda, dan Anda ingin mereka menjadi nilai unik, ketika Anda menggabungkan data, atur
ignore_index=True
.Atau, untuk menimpa indeks Anda saat ini dengan yang baru, alih-alih menggunakan
df.reindex()
, atur:sumber
ignore_index=False
adalah standarnya; jika menggunakan opsi adalah untuk mengubahappend
perilaku sama sekali, itu harus karena Anda mengaturnyaTrue
.Bagi orang-orang yang masih berjuang dengan kesalahan ini, itu juga bisa terjadi jika Anda secara tidak sengaja membuat kolom duplikat dengan nama yang sama. Hapus kolom rangkap seperti:
sumber
Cukup lewati kesalahan menggunakan
.values
di akhir.sumber
.values
melakukan trikSaya menemukan kesalahan ini hari ini ketika saya ingin menambahkan kolom baru seperti ini
Saya ingin memproses
REMARK
kolomdf_temp
untuk mengembalikan 1 atau 0. Namun saya mengetik variabel yang salah dengannyadf
. Dan itu mengembalikan kesalahan seperti ini:Seperti yang Anda lihat, kode yang tepat seharusnya
Karena
df
dandf_temp
memiliki jumlah baris yang berbeda. Jadi dia kembaliValueError: cannot reindex from a duplicate axis
.Semoga Anda bisa memahaminya dan jawaban saya dapat membantu orang lain untuk men-debug kode mereka.
sumber
Dalam kasus saya, kesalahan ini muncul bukan karena nilai duplikat, tetapi karena saya mencoba untuk bergabung dengan Seri yang lebih pendek ke Dataframe: keduanya memiliki indeks yang sama, tetapi Seri memiliki lebih sedikit baris (kehilangan beberapa atas). Berikut ini berfungsi untuk tujuan saya:
sumber
df_larger_dataframe['values'] = df_filtered_dataframe['filtered_values']
dan belum berfungsi akhir-akhir ini di TimeSeries - kode Anda menyelesaikannya!Saya menghabiskan beberapa jam untuk masalah yang sama. Dalam kasus saya, saya harus mereset_index () dari dataframe sebelum menggunakan fungsi apply. Sebelum menggabungkan, atau mencari dari dataset indeks lain, Anda perlu mengatur ulang indeks karena 1 dataset hanya dapat memiliki 1 Indeks.
sumber
Perbaikan Sederhana yang Berhasil bagi Saya
Jalankan
df.reset_index(inplace=True)
sebelum pengelompokan.Terima kasih atas komentar github ini untuk solusinya.
sumber