Eu criei um DataFrame do Pandas
df = DataFrame(index=['A','B','C'], columns=['x','y'])
e entendi
xy A NaN NaN B NaN NaN C NaN NaN
Quero atribuir valor a uma célula específica, por exemplo, para a linha 'C' e a coluna 'x'. Eu esperava obter esse resultado:
xy A NaN NaN B NaN NaN C 10 NaN
com este código:
df.xs('C')['x'] = 10
mas o conteúdo de df
não mudou. É novamente apenas NaN
s no DataFrame.
Alguma sugestão?
df['x']['C']
), usedf.ix['x','C']
.dataframe[column (series)] [row (Series index)]
:, enquanto muitas pessoas (inclusive eu) estão mais acostumadas àdataframe[row][column]
ordem. Como um programador Matlab e R últimos sente mais intuitivas para mim, mas que, aparentemente, não é o caminho Pandas funciona ..Respostas:
A resposta de RukTech ,
df.set_value('C', 'x', 10)
, é de longe mais rápido do que as opções que eu sugeri abaixo. No entanto, está programado para ser preterido .No futuro, o método recomendado é
.iat/.at
.Por
df.xs('C')['x']=10
que não funciona:df.xs('C')
por padrão, retorna um novo quadro de dados com uma cópia dos dados, portantomodifica apenas esse novo quadro de dados.
df['x']
retorna uma visão do quadro dedf
dados, portantose modifica
df
.Aviso : Às vezes, é difícil prever se uma operação retorna uma cópia ou uma exibição. Por esse motivo, os documentos recomendam evitar atribuições com "indexação encadeada" .
Portanto, a alternativa recomendada é
que se modifique
df
.fonte
df.x
na API . O que você quis dizer?'x'
é o nome de uma coluna emdf
.df.x
retorna aSeries
com os valores na colunax
. Vou mudar paradf['x']
uma vez que essa notação funcionará com qualquer nome de coluna (diferente da notação de ponto) e acho que é mais clara.df.x
era algum novo método desconhecido ao ladodf.xs, df.ix
df.xs(..., copy=True)
retorna uma cópia, e esse é o comportamento padrão.df.xs(..., copy=False)
retorna o original.Atualização: o
.set_value
método será preterido ..iat/.at
são boas substituições, infelizmente os pandas fornecem pouca documentaçãoA maneira mais rápida de fazer isso é usando set_value . Este método é ~ 100 vezes mais rápido que o
.ix
método. Por exemplo:df.set_value('C', 'x', 10)
fonte
df['x']['C'] = 10
.df=df.append(df.sum(numeric_only=True),ignore_index=True)
?Você também pode usar uma pesquisa condicional usando
.loc
como visto aqui:onde
<some_column_name
está a coluna na qual você deseja verificar a<condition>
variável e<another_column_name>
a coluna à qual deseja adicionar (pode ser uma nova coluna ou uma que já existe).<value_to_add>
é o valor que você deseja adicionar a essa coluna / linha.Este exemplo não funciona exatamente com a pergunta em questão, mas pode ser útil para alguém que deseja adicionar um valor específico com base em uma condição.
fonte
df.loc[df['age']==3, ['age-group']] = 'toddler'
A maneira recomendada (de acordo com os mantenedores) para definir um valor é:
Usar 'indexação encadeada' (
df['x']['C']
) pode levar a problemas.Vejo:
fonte
ix
está obsoleto: pandas-docs.github.io/pandas-docs-travis/…Tente usar
df.loc[row_index,col_indexer] = value
fonte
Esta é a única coisa que funcionou para mim!
Saiba mais sobre
.loc
aqui .fonte
.loc
substituir.iat/.at
?at
Semelhanteloc
, na medida em que ambos fornecem pesquisas baseadas em etiquetas. Useat
se você precisar apenas obter ou definir um único valor em um DataFrame ou Series. De padas doc.iat/.at
é a boa solução. Supondo que você tenha esse data_frame simples:se quisermos modificar o valor da célula,
[0,"A"]
você pode usar uma dessas soluções:df.iat[0,0] = 2
df.at[0,'A'] = 2
E aqui está um exemplo completo de como usar
iat
para obter e definir um valor de célula:y_train antes:
y_train após chamar a função prepossessing que
iat
muda para multiplicar o valor de cada célula por 2:fonte
Para definir valores, use:
set_value
,ix
foram preteridos.iloc
eloc
fonte
você pode usar
.iloc
.fonte
df.iloc[[2:8], [0]] = [2,3,4,5,6,7]
que o métododf.loc()
faz nativamente.No meu exemplo, eu apenas mudo na célula selecionada
'result' é um dataField com a coluna 'weight'
fonte
set_value()
está obsoleto.A partir do release 0.23.4, o Pandas " anuncia o futuro " ...
Considerando este conselho, aqui está uma demonstração de como usá-los:
Referências:
fonte
Aqui está um resumo das soluções válidas fornecidas por todos os usuários, para quadros de dados indexados por número inteiro e sequência.
O df.iloc, o df.loc e o df.at funcionam para ambos os tipos de quadros de dados, o df.iloc funciona apenas com índices inteiros de linha / coluna, os suportes df.loc e df.at para definir valores usando nomes de coluna e / ou índices inteiros .
Quando o índice especificado não existir, o df.loc e o df.at anexarão as linhas / colunas recém-inseridas ao quadro de dados existente, mas o df.iloc aumentará "IndexError: indexadores posicionais estão fora dos limites". Um exemplo de trabalho testado no Python 2.7 e 3.7 é o seguinte:
fonte
Eu testei e a saída é
df.set_value
um pouco mais rápida, mas o método oficialdf.at
parece a maneira mais rápida e não obsoleta de fazer isso.Observe que isso está configurando o valor para uma única célula. Para os vetores
loc
eiloc
deve haver melhores opções, pois são vetorizados.fonte
Uma maneira de usar o índice com condição é primeiro obter o índice de todas as linhas que satisfazem sua condição e, em seguida, simplesmente usar esses índices de várias maneiras
A condição de exemplo é como
Em seguida, você pode usar esses índices de linha de várias maneiras, como
Isso tudo é possível porque .index retorna uma matriz de índice que .loc pode usar com endereçamento direto, evitando travessias repetidas vezes.
fonte
df.loc['c','x']=10
Isso irá alterar o valor de c ª linha e x th coluna.fonte
Além das respostas acima, aqui está uma referência comparando diferentes maneiras de adicionar linhas de dados a um quadro de dados já existente. Isso mostra que o uso de ou valor definido é a maneira mais eficiente para grandes quadros de dados (pelo menos para essas condições de teste).
Para o teste, foi utilizado um quadro de dados existente compreendendo 100.000 linhas e 1.000 colunas e valores aleatórios de numpy. Para esse quadro de dados, 100 novas linhas foram adicionadas.
Código veja abaixo:
fonte
Se você deseja alterar os valores não para toda a linha, mas apenas para algumas colunas:
fonte
A partir da versão 0.21.1, você também pode usar o
.at
método Existem algumas diferenças em comparação com.loc
as mencionadas aqui - pandas .at versus .loc , mas é mais rápido na substituição de valor únicofonte
Então, sua pergunta para converter NaN em ['x', C] para o valor 10
a resposta é..
código alternativo é
fonte
Eu também estava procurando esse tópico e criei uma maneira de iterar através de um DataFrame e atualizá-lo com valores de pesquisa de um segundo DataFrame. Aqui está o meu código.
fonte