Estou recebendo um ValueError: cannot reindex from a duplicate axis
quando estou tentando definir um índice para um determinado valor. Tentei reproduzir isso com um exemplo simples, mas não consegui.
Aqui está a minha sessão dentro do ipdb
rastreamento. Eu tenho um DataFrame com índice de seqüência de caracteres e colunas inteiras, valores flutuantes. No entanto, quando tento criar sum
índice para a soma de todas as colunas, estou recebendo ValueError: cannot reindex from a duplicate axis
erro. Criei um pequeno DataFrame com as mesmas características, mas não consegui reproduzir o problema. O que poderia estar faltando?
Realmente não entendo o que ValueError: cannot reindex from a duplicate axis
significa, o que significa essa mensagem de erro? Talvez isso me ajude a diagnosticar o problema, e essa é a parte mais responsável da minha pergunta.
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
Aqui está o erro:
ipdb> affinity_matrix.loc['sums'] = affinity_matrix.sum(axis=0)
*** ValueError: cannot reindex from a duplicate axis
Tentei reproduzir isso com um exemplo simples, mas falhei
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
Respostas:
Esse erro geralmente ocorre quando você ingressa / atribui a uma coluna quando o índice tem valores duplicados. Como você está atribuindo uma linha, suspeito que exista um valor duplicado
affinity_matrix.columns
, talvez não mostrado na sua pergunta.fonte
affinity_matrix.index
, mas acho que esse é o mesmo conceito.index
significa ambosrow
ecolumn names
, passou 20 minutos no índice de linhas, mas acabou obtendo nomes de colunas duplicados que causaram esse erro.Como já foi dito, você provavelmente tem valores duplicados no seu índice original. Para encontrá-los, faça o seguinte:
df[df.index.duplicated()]
fonte
df = df[~df.index.duplicated()]
DatetimeIndex
dataframes ed, você poderesample
a frequência desejada e depois tomar.first()
,.mean()
etc.Os índices com valores duplicados geralmente surgem se você criar um DataFrame concatenando outros DataFrames. Se você não se preocupa em preservar os valores do seu índice e deseja que eles sejam valores únicos, quando concatenar os dados, defina
ignore_index=True
.Como alternativa, para substituir o índice atual por um novo, em vez de usar
df.reindex()
, defina:fonte
ignore_index=False
é o padrão; se o uso da opção for alterarappend
o comportamento de alguma forma, será necessário que você a configureTrue
.Para pessoas que ainda estão lutando com esse erro, isso também pode acontecer se você criar acidentalmente uma coluna duplicada com o mesmo nome. Remova colunas duplicadas da seguinte forma:
fonte
Basta pular o erro usando
.values
no final.fonte
.values
fez o truqueEncontrei este erro hoje quando quis adicionar uma nova coluna como esta
Eu queria processar a
REMARK
coluna dedf_temp
para retornar 1 ou 0. No entanto, digitei a variável errada comdf
. E retornou um erro como este:Como você pode ver, o código certo deve ser
Porque
df
edf_temp
tem um número diferente de linhas. Então voltouValueError: cannot reindex from a duplicate axis
.Espero que você possa entender e minha resposta possa ajudar outras pessoas a depurar seu código.
fonte
No meu caso, esse erro apareceu não por causa de valores duplicados, mas porque tentei associar uma série mais curta a um Dataframe: ambos tinham o mesmo índice, mas a série tinha menos linhas (faltando as primeiras). O seguinte funcionou para meus propósitos:
fonte
df_larger_dataframe['values'] = df_filtered_dataframe['filtered_values']
e não tem funcionado ultimamente no TimeSeries - seu código o resolveu!Perdi duas horas no mesmo assunto. No meu caso, tive que reset_index () de um quadro de dados antes de usar a função aplicar. Antes de mesclar ou procurar em outro conjunto de dados indexado, é necessário redefinir o índice, pois 1 conjunto de dados pode ter apenas 1 Índice.
fonte
Correção simples que funcionou para mim
Execute
df.reset_index(inplace=True)
antes do agrupamento.Obrigado a este comentário do github pela solução.
fonte