Apa yang dimaksud dengan `ValueError: tidak dapat mengindeks ulang dari sumbu duplikat`?

254

Saya mendapatkan ValueError: cannot reindex from a duplicate axisketika 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 ipdbjejak. Saya memiliki DataFrame dengan indeks string, dan kolom integer, nilai float. Namun ketika saya mencoba membuat sumindeks untuk jumlah semua kolom saya mendapatkan ValueError: cannot reindex from a duplicate axiskesalahan. 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 axisartinya, 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
Akavall
sumber
1
Apakah ada kemungkinan Anda mengaburkan nama kolom asli dari matriks afinitas Anda? (Yaitu mengganti nilai nyata dengan sesuatu yang lain untuk menyembunyikan informasi sensitif)
Korem
@ Korem, saya tidak berpikir ini benar, tetapi bahkan jika ini benar, mengapa ini menyebabkan kesalahan di atas?
Akavall
2
Saya biasanya melihat ini ketika indeks ditugaskan memiliki nilai duplikat. Karena dalam kasus Anda, Anda menetapkan baris, saya mengharapkan duplikat dalam nama kolom. Itulah mengapa saya bertanya.
Korem
@ Korem, Memang data aktual saya memiliki nilai indeks duplikat, dan saya bisa mereproduksi kesalahan dalam contoh kecil ketika nilai indeks duplikat hadir. Anda sepenuhnya menjawab pertanyaan saya. Terima kasih. Apakah Anda keberatan meletakkannya sebagai jawaban?
Akavall

Jawaban:

170

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.

Korem
sumber
20
Untuk lebih akurat, dalam kasus saya nilai duplikat masuk affinity_matrix.index, tapi saya pikir ini adalah konsep yang sama.
Akavall
24
Bagi mereka yang datang ke sini nanti, indexberarti keduanya rowdan column names, menghabiskan 20 menit pada indeks baris tetapi ternyata saya mendapat nama kolom duplikat yang menyebabkan kesalahan ini.
Jason Goal
Untuk menambah ini, saya menemukan kesalahan ini ketika saya mencoba untuk mengindeks kembali kerangka data pada daftar kolom. Anehnya, duplikat saya ada dalam kerangka data asli saya, jadi pastikan untuk memeriksa keduanya!
m8_
163

Seperti yang orang lain katakan, Anda mungkin memiliki nilai duplikat di indeks asli Anda. Untuk menemukannya lakukan ini:

df[df.index.duplicated()]

Matius
sumber
39
Untuk menghapus baris dengan indeks duplikat, gunakan:df = df[~df.index.duplicated()]
tuomastik
4
Untuk DatetimeIndexdataframes ed, Anda dapat resampledengan frekuensi yang diinginkan dan kemudian mengambil .first(), .mean(), dll
BallpointBen
28

Indeks 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:

df.index = new_index
Rebeku
sumber
8
Saya menggunakan ign_index = Benar untuk membuat kode saya bekerja dengan kerangka data gabungan
Gabi Lee
Memang, ignore_index=Falseadalah standarnya; jika menggunakan opsi adalah untuk mengubah appendperilaku sama sekali, itu harus karena Anda mengaturnya True.
Jeffrey Benjamin Brown
17

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:

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

Cukup lewati kesalahan menggunakan .valuesdi akhir.

affinity_matrix.loc['sums'] = affinity_matrix.sum(axis=0).values
Hadij
sumber
Ini adalah persis apa yang saya butuhkan! Hanya mencoba membuat kolom baru, tetapi saya memiliki indeks dengan duplikat di dalamnya. Menggunakan .valuesmelakukan trik
Paul Wildenhain
8

Saya menemukan kesalahan ini hari ini ketika saya ingin menambahkan kolom baru seperti ini

df_temp['REMARK_TYPE'] = df.REMARK.apply(lambda v: 1 if str(v)!='nan' else 0)

Saya ingin memproses REMARKkolom df_tempuntuk mengembalikan 1 atau 0. Namun saya mengetik variabel yang salah dengannya df. Dan itu mengembalikan kesalahan seperti ini:

----> 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

Seperti yang Anda lihat, kode yang tepat seharusnya

df_temp['REMARK_TYPE'] = df_temp.REMARK.apply(lambda v: 1 if str(v)!='nan' else 0)

Karena dfdan df_tempmemiliki jumlah baris yang berbeda. Jadi dia kembali ValueError: cannot reindex from a duplicate axis.

Semoga Anda bisa memahaminya dan jawaban saya dapat membantu orang lain untuk men-debug kode mereka.

GoingMyWay
sumber
4

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:

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
tehfink
sumber
Terima kasih! Saya sudah terbiasa memfilter dan kemudian menggabungkan DataFrames dan Series 'seperti itu: df_larger_dataframe['values'] = df_filtered_dataframe['filtered_values'] dan belum berfungsi akhir-akhir ini di TimeSeries - kode Anda menyelesaikannya!
tw0000
2

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.

rishi jain
sumber
2

Perbaikan Sederhana yang Berhasil bagi Saya

Jalankan df.reset_index(inplace=True)sebelum pengelompokan.

Terima kasih atas komentar github ini untuk solusinya.

Connor
sumber
@Chris_vr menghapus bagian inplace jika Anda ingin mengembalikan bingkai data
Connor