"ValueError: yinelenen bir eksenden yeniden dizine eklenemez" ne anlama geliyor?


256

ValueError: cannot reindex from a duplicate axisBelirli bir değere bir dizin ayarlamak için çalışıyorum zaman alıyorum . Bunu basit bir örnekle çoğaltmaya çalıştım, ama yapamadım.

İşte izimin içindeki oturumum ipdb. Dize dizini ve tamsayı sütunları, kayan nokta değerleri olan bir DataFrame var. Ancak sumtüm sütunların toplamı için dizin oluşturmaya çalıştığımda ValueError: cannot reindex from a duplicate axishata alıyorum. Aynı özelliklere sahip küçük bir DataFrame oluşturdum, ancak sorunu yeniden üretemedim, ne eksik olabilirim?

Gerçekten ne ValueError: cannot reindex from a duplicate axisanlama geldiğini anlamıyorum , bu hata mesajı ne anlama geliyor? Belki bu sorunu teşhis etmeme yardımcı olacaktır ve bu benim sorumun en çok cevaplanan kısmı.

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

İşte hata:

ipdb> affinity_matrix.loc['sums'] = affinity_matrix.sum(axis=0)
*** ValueError: cannot reindex from a duplicate axis

Bunu basit bir örnekle çoğaltmaya çalıştım ama başarısız oldum

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

1
Yakınlık matrisinizin gerçek sütun adlarını gizleme şansınız var mı? (yani, hassas bilgileri gizlemek için gerçek değerleri başka bir şeyle değiştirdi)
Korem

@Korem, bunun doğru olduğunu düşünmüyorum, ancak bu doğru olsa bile, neden yukarıdaki hataya neden olur?
Akavall

2
Genellikle atanan dizin yinelenen değerlere sahip olduğunda bunu görürüm. Sizin durumunuzda bir satır atadığınızdan, sütun adlarında bir kopya bekliyorum. Bu yüzden sordum.
Korem

@Korem, Aslında gerçek verilerim yinelenen dizin değerleri vardı ve yinelenen dizin değerleri bulunduğunda küçük örnekte hatayı yeniden üretebildim. Soruma tamamen cevap verdin. Teşekkür ederim. Cevap olarak vermek ister misiniz?
Akavall

Yanıtlar:


171

Bu hata genellikle dizinde yinelenen değerler olduğunda bir sütuna katıldığınızda / atadığınızda yükselir. Bir satıra atadığınızdan affinity_matrix.columns, muhtemelen sorunuzda gösterilmeyen yinelenen bir değer olduğundan şüpheleniyorum .


20
Daha doğru olmak gerekirse, benim durumumda yinelenen bir değer vardı affinity_matrix.index, ama bence bu aynı kavram.
Akavall

24
Bu daha sonra gelenler için, indexhem anlamına gelir rowve column namessatır dizini üzerinde 20 dakika geçirdim ama çıktı Bu hataya neden yinelenen sütun adları var.
Jason Goal

Buna eklemek için, sütunlar listesinde bir veri çerçevesini yeniden dizine eklemeye çalıştığımda bu hatayla karşılaştım. İşin tuhafı, yinelem orijinal veri çerçevemdeydi, bu yüzden ikisini de kontrol ettiğinizden emin olun!
m8_

163

Diğerlerinin söylediği gibi, muhtemelen orijinal dizininizde yinelenen değerler var. Onları bulmak için bunu yapın:

df[df.index.duplicated()]


39
Yinelenen dizinleri olan satırları kaldırmak için şunu kullanın:df = df[~df.index.duplicated()]
tuomastik

4
İçin DatetimeIndexed dataframes yapabilirsiniz resampleistenen frekansa ve daha sonra almak .first(), .mean()vb
BallpointBen

29

Başka DataFrame'leri birleştirerek bir DataFrame oluşturursanız, yinelenen değerlere sahip dizinler ortaya çıkar. Dizininizin değerlerini koruma konusunda umursamıyorsanız ve verileri birleştirirken bunların benzersiz değerler olmasını istiyorsanız, ayarlayın ignore_index=True.

Alternatif olarak, geçerli dizininizi kullanmak yerine yenisiyle değiştirmek için aşağıdakileri df.reindex()ayarlayın:

df.index = new_index

9
Ben kodumu birleştirilmiş veri çerçeveleri ile çalışmak için ignore_index = True kullandım
Gabi Lee

Gerçekten ignore_index=Falsede varsayılan; Bu seçeneği kullanmak, appenddavranışını hiç değiştirmekse , bunu ayarladığınız için olmalıdır True.
Jeffrey Benjamin Brown

10 saatimi hatamı anlamaya çalışarak geçirdim ve cevabınız bana yardımcı oldu. İki veri çerçevesini birleştiriyor ve son dizini görmek için df.tail () arıyor. Gerçek şu ki, dizin çoğalıyordu.
Isac Moura

17

Hala bu hatayla mücadele eden insanlar için, yanlışlıkla aynı adla yinelenen bir sütun oluşturursanız da olabilir. Aşağıdaki gibi yinelenen sütunları kaldırın:

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

12

.valuesSonunda kullanarak hatayı atlamanız yeterlidir .

affinity_matrix.loc['sums'] = affinity_matrix.sum(axis=0).values

Bu tam olarak ne gerekli! Sadece yeni bir sütun oluşturmaya çalışıyorum, ancak içinde yinelenen bir dizin vardı. Kullanarak .valueshile
Paul Wildenhain

8

Bugün böyle bir sütun eklemek istediğimde bu hatayla karşılaştım

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

1 veya 0 döndürmek için REMARKsütununu işlemek istedim. df_tempAncak ile yanlış değişken yazdım df. Ve şöyle bir hata döndürdü:

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

Gördüğünüz gibi, doğru kod

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

Çünkü dfve df_tempfarklı sayıda satır var. Böylece geri döndü ValueError: cannot reindex from a duplicate axis.

Umarım bunu anlayabilirsin ve cevabım diğer insanların kodlarında hata ayıklamalarına yardımcı olabilir.


4

Benim durumumda, bu hata yinelenen değerler nedeniyle değil, ancak bir Dataframe'e daha kısa bir Seriye katılmaya çalıştığım için: her ikisi de aynı dizine sahipti, ancak Seride daha az satır vardı (ilk birkaç eksik). Aşağıdakiler benim amacım için çalıştı:

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

Teşekkür ederim! DataFrames ve Series'i filtrelemeye ve daha sonra birleştirmeye alışıktım: df_larger_dataframe['values'] = df_filtered_dataframe['filtered_values'] ve son zamanlarda TimeSeries üzerinde çalışmadı - kodunuz çözüldü!
tw0000

2

Aynı konuda birkaç saat harcadım. Benim durumumda, uygulama işlevini kullanmadan önce bir veri çerçevesinin reset_index'ini () sıfırlamak zorunda kaldım . Birleştirmeden veya başka bir dizinlenmiş veri kümesinden bakmadan önce, 1 veri kümesinde yalnızca 1 Dizin olabileceği için dizini sıfırlamanız gerekir.


2

Benim İçin Çalışan Basit Düzeltme

df.reset_index(inplace=True)Gruplamadan önce çalıştırın .

Çözüm için bu github yorumuna teşekkür ederim .


@Chris_vr, veri çerçevesini geri döndürmek istiyorsanız, dahili kısmı kaldırın
Connor
Sitemizi kullandığınızda şunları okuyup anladığınızı kabul etmiş olursunuz: Çerez Politikası ve Gizlilik Politikası.
Licensed under cc by-sa 3.0 with attribution required.