`ValueError: একটি সদৃশ অক্ষ থেকে পুনরায় সূচি করতে পারে না মানে কি?


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

এই ত্রুটিটি যখন আপনি যখন কোনও কলামে যোগদান করেন / নির্ধারণ করেন তখন সূচকের সদৃশ মান থাকে es যেহেতু আপনি একটি সারিতে নির্ধারিত হচ্ছেন তাই আমার সন্দেহ হয় যে এখানে একটি সদৃশ মান রয়েছে যা 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

ডুপ্লিকেট মান সহ সূচকগুলি প্রায়শই উত্থাপিত হয় যদি আপনি অন্য ডেটাফ্রেমগুলি যুক্ত করে ডেটাফ্রেম তৈরি করেন। যদি আপনি আপনার সূচকের মান সংরক্ষণের বিষয়ে চিন্তা না করেন এবং আপনি ডেটা সংবিধানের সাথে সেট করে সেগুলি অনন্য মান হিসাবে চান ignore_index=True

বিকল্পভাবে, আপনার বর্তমান সূচকটি নতুন দিয়ে মুছে ফেলার জন্য ব্যবহারের পরিবর্তে df.reindex()সেট করুন:

df.index = new_index

8
আমি কনটেনটেটেড ডেটাফ্রেমে আমার কোডটি পাওয়ার জন্য উপেক্ষা_ইনডেক্স = সত্য ব্যবহার করেছি
লি

প্রকৃতপক্ষে, 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'] এবং এটি টাইমসারিগুলিতে ইদানীং কাজ করছে না - আপনার কোড এটি সমাধান করেছে!
tw0000

2

আমি একই সমস্যা কয়েক ঘন্টা নষ্ট। আমার ক্ষেত্রে, প্রয়োগের ফাংশনটি ব্যবহার করার আগে আমাকে একটি ডেটা ফ্রেমের রিসেট_ইন্ডেক্স () করতে হয়েছিল। মার্জ করার আগে, বা অন্য সূচী ডেটাसेट থেকে সন্ধানের আগে, আপনাকে সূচকটি পুনরায় সেট করতে হবে কারণ 1 টি ডেটাসেটে কেবল 1 টি সূচক থাকতে পারে।


2

সিম্পল ফিক্স যা আমার জন্য কাজ করেছে

চালান df.reset_index(inplace=True)গোষ্ঠীবদ্ধ আগে।

সমাধানের জন্য এই গিথুব মন্তব্যে আপনাকে ধন্যবাদ ।


@ ক্রিস_ভিআর যদি চাই যে ডেটাফ্রেমটি ফিরিয়ে আনতে চান
কনার
আমাদের সাইট ব্যবহার করে, আপনি স্বীকার করেছেন যে আপনি আমাদের কুকি নীতি এবং গোপনীয়তা নীতিটি পড়েছেন এবং বুঝতে পেরেছেন ।
Licensed under cc by-sa 3.0 with attribution required.