`ValueError: không thể reindex từ một trục trùng lặp 'nghĩa là gì?


254

Tôi nhận được một ValueError: cannot reindex from a duplicate axiskhi tôi đang cố gắng đặt một chỉ mục đến một giá trị nhất định. Tôi đã cố gắng tái tạo điều này với một ví dụ đơn giản, nhưng tôi không thể làm được.

Đây là phiên của tôi bên trong ipdbdấu vết. Tôi có một DataFrame với chỉ mục chuỗi và các cột số nguyên, các giá trị float. Tuy nhiên, khi tôi cố gắng tạo sumchỉ mục cho tổng của tất cả các cột, tôi sẽ gặp ValueError: cannot reindex from a duplicate axislỗi. Tôi đã tạo một DataFrame nhỏ có cùng đặc điểm, nhưng không thể tái tạo vấn đề, tôi có thể thiếu gì?

Tôi không thực sự hiểu ý ValueError: cannot reindex from a duplicate axisnghĩa của nó, thông báo lỗi này có nghĩa là gì? Có lẽ điều này sẽ giúp tôi chẩn đoán vấn đề, và đây là phần dễ trả lời nhất trong câu hỏi của tôi.

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

Đây là lỗi:

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

Tôi đã cố gắng tái tạo điều này với một ví dụ đơn giản, nhưng tôi đã thất bại

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
Có bất kỳ cơ hội nào mà bạn làm xáo trộn tên cột thực của ma trận ái lực của bạn không? (tức là thay thế các giá trị thực bằng một thứ khác để ẩn thông tin nhạy cảm)
Korem

@Korem, tôi không nghĩ điều này là đúng, nhưng ngay cả khi điều này là đúng, tại sao điều này lại gây ra lỗi trên?
Akavall

2
Tôi thường thấy điều này khi chỉ mục được gán có giá trị trùng lặp. Vì trong trường hợp của bạn, bạn đang gán một hàng, tôi mong đợi một bản sao trong tên cột. Đó là lý do tại sao tôi hỏi.
Korem

@Korem, Thật vậy, dữ liệu thực tế của tôi có các giá trị chỉ mục trùng lặp và tôi có thể tái tạo lỗi trong ví dụ nhỏ khi có các giá trị chỉ mục trùng lặp. Bạn trả lời đầy đủ câu hỏi của tôi. Cảm ơn bạn. Bạn có phiền khi đặt nó như một câu trả lời?
Akavall

Câu trả lời:


170

Lỗi này thường tăng khi bạn tham gia / gán cho một cột khi chỉ mục có các giá trị trùng lặp. Vì bạn đang gán cho một hàng, tôi nghi ngờ rằng có một giá trị trùng lặp affinity_matrix.columns, có lẽ không được hiển thị trong câu hỏi của bạn.


20
Nói chính xác hơn, trong trường hợp của tôi, một giá trị trùng lặp đã được đưa vào affinity_matrix.index, nhưng tôi nghĩ đây là khái niệm tương tự.
Akavall

24
Đối với những người đến sau này, indexcó nghĩa là cả hai rowcolumn names, đã dành 20 phút cho chỉ mục hàng nhưng hóa ra tôi đã nhận được các tên cột trùng lặp gây ra lỗi này.
Mục tiêu Jason

Để thêm vào điều này, tôi đã gặp phải lỗi này khi tôi cố gắng lập chỉ mục lại một khung dữ liệu trên danh sách các cột. Thật kỳ lạ, bản sao của tôi nằm trong khung dữ liệu gốc của tôi, vì vậy hãy chắc chắn kiểm tra cả hai!
m8_

163

Như những người khác đã nói, có lẽ bạn đã có các giá trị trùng lặp trong chỉ mục ban đầu của mình. Để tìm thấy họ làm điều này:

df[df.index.duplicated()]


39
Để xóa các hàng có chỉ số trùng lặp, hãy sử dụng:df = df[~df.index.duplicated()]
tuomastik

4
Đối với DatetimeIndexdataframes ed, bạn có thể resamplevới tần số mong muốn và sau đó đi .first(), .mean()vv
BallpointBen

28

Các chỉ mục có giá trị trùng lặp thường phát sinh nếu bạn tạo DataFrame bằng cách ghép các DataFrames khác. NẾU bạn không quan tâm đến việc bảo tồn các giá trị của chỉ mục của mình và bạn muốn chúng là các giá trị duy nhất, khi bạn nối dữ liệu, hãy đặt ignore_index=True.

Ngoài ra, để ghi đè chỉ mục hiện tại của bạn bằng một chỉ mục mới, thay vì sử dụng df.reindex(), hãy đặt:

df.index = new_index

8
Tôi đã sử dụng ign_index = True để mã của tôi hoạt động với các tệp dữ liệu được nối
Gabi Lee

Thật vậy, ignore_index=Falselà mặc định; nếu sử dụng tùy chọn này là để thay đổi appendhành vi của tất cả, thì nó sẽ phải là do bạn đặt nó thành True.
Jeffrey Benjamin Brown

17

Đối với những người vẫn đang vật lộn với lỗi này, nó cũng có thể xảy ra nếu bạn vô tình tạo một cột trùng lặp có cùng tên. Xóa các cột trùng lặp như vậy:

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

12

Đơn giản chỉ cần bỏ qua lỗi sử dụng .valuesở cuối.

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

Đây chính xác là những gì tôi cần! Chỉ cố gắng tạo một cột mới, nhưng tôi đã có một chỉ mục với các bản sao trong đó. Sử dụng .valuesđã thực hiện mánh khóe
Paul Wildenhain

8

Tôi đã gặp lỗi này ngày hôm nay khi tôi muốn thêm một cột mới như thế này

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

Tôi muốn xử lý REMARKcột df_tempđể trả về 1 hoặc 0. Tuy nhiên tôi đã nhập sai biến với df. Và nó trả về lỗi như thế này:

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

Như bạn có thể thấy, mã đúng phải là

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

Bởi vì dfdf_tempcó số lượng hàng khác nhau. Thế là nó trở về ValueError: cannot reindex from a duplicate axis.

Hy vọng bạn có thể hiểu nó và câu trả lời của tôi có thể giúp người khác gỡ lỗi mã của họ.


4

Trong trường hợp của tôi, lỗi này xuất hiện không phải vì các giá trị trùng lặp, mà vì tôi đã cố gắng tham gia Sê-ri ngắn hơn vào Dataframe: cả hai đều có cùng một chỉ mục, nhưng Sê-ri có ít hàng hơn (thiếu vài hàng đầu). Sau đây làm việc cho mục đích của tôi:

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

Cảm ơn bạn! Tôi đã quen với việc lọc và sau đó hợp nhất DataFrames và Series 'như vậy: df_larger_dataframe['values'] = df_filtered_dataframe['filtered_values'] và nó đã không hoạt động gần đây trên TimeSeries - mã của bạn đã giải quyết nó!
tw0000

2

Tôi đã lãng phí vài giờ cho cùng một vấn đề. Trong trường hợp của tôi, tôi đã phải thiết lập lại_index () của một khung dữ liệu trước khi sử dụng hàm áp dụng. Trước khi hợp nhất hoặc tra cứu từ một tập dữ liệu được lập chỉ mục khác, bạn cần đặt lại chỉ mục vì 1 tập dữ liệu có thể chỉ có 1 Chỉ mục.


2

Khắc phục đơn giản mà hiệu quả với tôi

Chạy df.reset_index(inplace=True)trước khi nhóm.

Cảm ơn bạn để bình luận github cho giải pháp.


@Chris_vr xóa phần tại chỗ nếu bạn muốn nó trả về khung dữ liệu
Connor
Khi sử dụng trang web của chúng tôi, bạn xác nhận rằng bạn đã đọc và hiểu Chính sách cookieChính sách bảo mật của chúng tôi.
Licensed under cc by-sa 3.0 with attribution required.