क्या करता है `ValueError: डुप्लिकेट अक्ष से reindex नहीं कर सकता है?


254

मुझे ValueError: cannot reindex from a duplicate axisतब मिल रहा है जब मैं एक निश्चित मूल्य के लिए एक सूचकांक निर्धारित करने की कोशिश कर रहा हूं। मैंने एक सरल उदाहरण के साथ इसे पुन: पेश करने की कोशिश की, लेकिन मैं ऐसा नहीं कर सका।

यहाँ ipdbट्रेस के अंदर मेरा सत्र है । मेरे पास स्ट्रिंग इंडेक्स और पूर्णांक कॉलम, फ्लोट वैल्यू के साथ डेटाफ्रेम है। हालाँकि जब मैं sumसभी कॉलमों के योग के लिए इंडेक्स बनाने की कोशिश करता हूँ तो मुझे ValueError: cannot reindex from a duplicate axisत्रुटि हो रही है। मैंने एक ही विशेषताओं के साथ एक छोटा डेटाफ़्रेम बनाया, लेकिन समस्या को पुन: उत्पन्न करने में सक्षम नहीं था, मैं क्या गायब हो सकता था?

मैं वास्तव में समझ नहीं पा रहा हूं ValueError: cannot reindex from a duplicate axisकि इस त्रुटि संदेश का क्या मतलब है? शायद इससे मुझे समस्या का निदान करने में मदद मिलेगी, और यह मेरे सवाल का सबसे जवाबदेह हिस्सा है।

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

यहाँ त्रुटि है:

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

मैंने इसे एक सरल उदाहरण के साथ पुन: पेश करने की कोशिश की, लेकिन मैं असफल रहा

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
क्या कोई मौका है कि आप अपने आत्मीयता मैट्रिक्स के वास्तविक स्तंभ नामों को बाधित करते हैं? (अर्थात संवेदनशील जानकारी को छिपाने के लिए वास्तविक मूल्यों को किसी और चीज़ से बदल दिया जाए)
कोरम

@ कोरम, मुझे नहीं लगता कि यह सच है, लेकिन अगर यह सच है, तो भी उपरोक्त त्रुटि क्यों होगी?
अकवल

2
मैं आमतौर पर इसे देखता हूं जब सूचकांक को डुप्लिकेट मानों को सौंपा जाता है। चूंकि आपके मामले में आप एक पंक्ति निर्दिष्ट कर रहे हैं, इसलिए मुझे कॉलम नामों में एक डुप्लिकेट की उम्मीद थी। इसीलिए मैंने पूछा।
कोरम

@ कोरम, वास्तव में मेरे वास्तविक डेटा में डुप्लिकेट इंडेक्स मान थे, और मैं डुप्लिकेट इंडेक्स मान मौजूद होने पर छोटे उदाहरण में त्रुटि को पुन: उत्पन्न करने में सक्षम था। आपने मेरे सवाल का पूरी तरह से जवाब दिया। धन्यवाद। क्या आप इसे एक जवाब के रूप में डालते हैं?
अकवल

जवाबों:


170

यह त्रुटि आमतौर पर तब उठती है जब आप एक कॉलम में शामिल होते / असाइन करते हैं जब सूचकांक में डुप्लिकेट मान होते हैं। चूंकि आप एक पंक्ति में असाइन कर रहे हैं, मुझे संदेह है कि इसमें एक डुप्लिकेट मान है affinity_matrix.columns, शायद आपके प्रश्न में नहीं दिखाया गया है।


20
अधिक सटीक होने के लिए, मेरे मामले में एक डुप्लिकेट मान था affinity_matrix.index, लेकिन मुझे लगता है कि यह एक ही अवधारणा है।
अकवाल

24
इसके बाद आने वालों के लिए, indexदोनों का मतलब है rowऔर column names, पंक्ति सूचकांक पर 20 मिनट बिताए, लेकिन मुझे पता चला कि मुझे डुप्लिकेट किए गए कॉलम नाम मिले जो इस त्रुटि का कारण बने।
जेसन लक्ष्य

इसे जोड़ने के लिए, मैं इस त्रुटि के सामने आया जब मैंने स्तंभों की सूची पर एक डेटाफ्रेम को फिर से जोड़ने की कोशिश की। विचित्र रूप से पर्याप्त है, मेरा डुप्लिकेट मेरे मूल डेटाफ़्रेम में था, इसलिए दोनों की जांच करना सुनिश्चित करें!
एम 8_

163

जैसा कि दूसरों ने कहा है, आपको अपने मूल सूचकांक में डुप्लिकेट मान मिले हैं। उन्हें ऐसा करने के लिए:

df[df.index.duplicated()]


39
डुप्लिकेट सूचकांकों के साथ पंक्तियों को हटाने के लिए, उपयोग करें:df = df[~df.index.duplicated()]
tuomastik

4
के लिए DatetimeIndexएड dataframes, आप कर सकते हैं resampleइच्छित आवृत्ति के लिए और फिर लेने .first(), .mean()आदि
BallpointBen

28

यदि आप अन्य DataFrames को बदलते हुए एक DataFrame बनाते हैं, तो डुप्लिकेट मान वाले संकेत अक्सर उत्पन्न होते हैं। यदि आप अपने सूचकांक के मूल्यों को संरक्षित करने के बारे में परवाह नहीं करते हैं, और आप चाहते हैं कि वे अद्वितीय मूल्य हों, जब आप डेटा को सेट करते हैं, तो सेट करें ignore_index=True

वैकल्पिक रूप से, अपने वर्तमान सूचकांक को एक नए के साथ अधिलेखित करने के लिए, उपयोग करने के बजाय df.reindex(), सेट करें:

df.index = new_index

8
मैंने अनदेखा डेटाफ़्रेम के साथ काम करने के लिए अपने कोड को प्राप्त करने के लिए ign_index = True का उपयोग किया
Gabi Lee

वास्तव में, ignore_index=Falseडिफ़ॉल्ट है; यदि विकल्प का उपयोग करना है append, तो व्यवहार को बिल्कुल बदलना है , क्योंकि आपको इसे सेट करना होगा True
जेफरी बेंजामिन ब्राउन

17

जो लोग अभी भी इस त्रुटि से जूझ रहे हैं, उनके लिए यह गलती से भी हो सकता है कि आप उसी नाम से डुप्लिकेट कॉलम बनाएं। डुप्लिकेट कॉलम निकालें जैसे:

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

12

बस .valuesअंत में त्रुटि को छोड़ें ।

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

यह वही है जो मुझे चाहिए था! बस एक नया कॉलम बनाने की कोशिश कर रहा हूं, लेकिन मेरे पास इसमें डुप्लिकेट के साथ एक इंडेक्स था। .valuesचाल का उपयोग करके
पॉल वाइल्डनहिन

8

मुझे आज यह त्रुटि आई जब मैं इस तरह एक नया कॉलम जोड़ना चाहता था

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

मैं 1 या 0. को वापस करने REMARKके df_tempलिए कॉलम को प्रोसेस करना चाहता था । हालाँकि मैंने गलत चर टाइप किया df। और यह इस तरह त्रुटि लौटाया:

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

जैसा कि आप देख सकते हैं, सही कोड होना चाहिए

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

क्योंकि dfऔर df_tempपंक्तियों की एक अलग संख्या है। तो यह लौट आया ValueError: cannot reindex from a duplicate axis

आशा है कि आप इसे समझ सकते हैं और मेरा उत्तर अन्य लोगों को अपने कोड को डीबग करने में मदद कर सकता है।


4

मेरे मामले में, यह त्रुटि डुप्लिकेट मानों के कारण नहीं हुई, बल्कि इसलिए कि मैंने एक छोटी सी श्रृंखला को एक डेटाफ़्रेम में शामिल करने का प्रयास किया: दोनों में एक ही सूचकांक था, लेकिन श्रृंखला में कम पंक्तियाँ थीं (कुछ शीर्ष गायब)। निम्नलिखित मेरे उद्देश्यों के लिए काम किया:

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

धन्यवाद! मैं फ़िल्टर करने और बाद में डेटाफ़्रेम और श्रृंखला 'जैसे विलय करने का आदी हो गया था: df_larger_dataframe['values'] = df_filtered_dataframe['filtered_values'] और यह समयसीमा पर हाल ही में काम नहीं कर रहा है - आपके कोड ने इसे हल कर दिया है!
जुड़वां ००६

2

मैंने उसी मुद्दे पर कुछ घंटों का समय बर्बाद किया। मेरे मामले में, मुझे एप्लिकेशन फ़ंक्शन का उपयोग करने से पहले डेटाफ़्रेम का रीसेट () करना था। विलय करने या किसी अन्य अनुक्रमित डेटासेट से देखने से पहले, आपको सूचकांक को रीसेट करने की आवश्यकता है क्योंकि 1 डेटासेट में केवल 1 इंडेक्स हो सकता है।


2

सिंपल फिक्स जो मेरे लिए काम करता था

df.reset_index(inplace=True)समूह बनाने से पहले चलाएं ।

समाधान के लिए इस github टिप्पणी के लिए धन्यवाद ।


यदि आप डेटाफ़्रेम को वापस करना चाहते हैं तो @Chris_vr इनहेल्म भाग को हटा दें
धक्का देकर
हमारी साइट का प्रयोग करके, आप स्वीकार करते हैं कि आपने हमारी Cookie Policy और निजता नीति को पढ़ और समझा लिया है।
Licensed under cc by-sa 3.0 with attribution required.