Eu tenho uma lista 'abc' e um dataframe 'df':
abc = ['foo', 'bar']
df =
A B
0 12 NaN
1 23 NaN
Quero inserir a lista na célula 1B, então quero este resultado:
A B
0 12 NaN
1 23 ['foo', 'bar']
Como posso fazer isso?
1) Se eu usar isso:
df.ix[1,'B'] = abc
Eu recebi a seguinte mensagem de erro:
ValueError: Must have equal len keys and value when setting with an iterable
porque tenta inserir a lista (que tem dois elementos) em uma linha / coluna, mas não em uma célula.
2) Se eu usar isso:
df.ix[1,'B'] = [abc]
em seguida, ele insere uma lista que possui apenas um elemento que é a lista 'abc' ( [['foo', 'bar']]
).
3) Se eu usar isso:
df.ix[1,'B'] = ', '.join(abc)
então ele insere uma string: ( foo, bar
) mas não uma lista.
4) Se eu usar isso:
df.ix[1,'B'] = [', '.join(abc)]
em seguida, insere uma lista, mas tem apenas um elemento ( ['foo, bar']
), mas não dois como eu quero ( ['foo', 'bar']
).
Obrigado pela ajuda!
EDITAR
Meu novo dataframe e a lista antiga:
abc = ['foo', 'bar']
df2 =
A B C
0 12 NaN 'bla'
1 23 NaN 'bla bla'
Outro dataframe:
df3 =
A B C D
0 12 NaN 'bla' ['item1', 'item2']
1 23 NaN 'bla bla' [11, 12, 13]
Desejo inserir a lista 'abc' em df2.loc[1,'B']
e / ou df3.loc[1,'B']
.
Se o dataframe tiver colunas apenas com valores inteiros e / ou valores NaN e / ou valores de lista, inserir uma lista em uma célula funciona perfeitamente. Se o dataframe tiver colunas apenas com valores de string e / ou valores NaN e / ou valores de lista, inserir uma lista em uma célula funciona perfeitamente. Mas se o dataframe tiver colunas com valores inteiros e de string e outras colunas, a mensagem de erro aparecerá se eu usar isto: df2.loc[1,'B'] = abc
ou df3.loc[1,'B'] = abc
.
Outro dataframe:
df4 =
A B
0 'bla' NaN
1 'bla bla' NaN
Essas inserções funcionam perfeitamente: df.loc[1,'B'] = abc
ou df4.loc[1,'B'] = abc
.
0.15.0
:df.loc[1,'b'] = ['foo','bar']
Respostas:
Já
set_value
que está obsoleto desde a versão 0.21.0, você deve usar agoraat
. Ele pode inserir uma lista em uma célula sem gerar umValueError
como oloc
faz. Acho que isso ocorre porqueat
sempre se refere a um único valor, enquantoloc
pode se referir a valores, bem como linhas e colunas.Você também precisa ter certeza de que a coluna na qual está inserindo tem
dtype=object
. Por exemplofonte
df = pd.DataFrame(data, dtype=object)
ValueError: setting an array element with a sequence.
; veja uma resposta por @ cs95 se obtiver o erro.df3.set_value(1, 'B', abc)
funciona para qualquer dataframe. Tome cuidado com o tipo de dados da coluna 'B'. Por exemplo. uma lista não pode ser inserida em uma coluna flutuante, nesse casodf['B'] = df['B'].astype(object)
pode ajudar.fonte
Pandas> = 0,21
set_value
foi descontinuado. Agora você pode usarDataFrame.at
para definir por rótulo eDataFrame.iat
para definir por posição inteira.Definir valores de células com
at
/iat
Se você quiser definir um valor na segunda linha do "B" para alguma nova lista, use
DataFrane.at
:Você também pode definir por posição inteira usando
DataFrame.iat
E se eu conseguir
ValueError: setting an array element with a sequence
?Vou tentar reproduzir isso com:
Isso ocorre porque o seu objeto é do tipo
float64
d, enquanto as listas sãoobject
s, então há uma incompatibilidade aí. O que você teria que fazer nessa situação é converter a coluna em objeto primeiro.Então, funciona:
Possível, mas Hacky
Ainda mais maluco, descobri que você pode hackear
DataFrame.loc
para conseguir algo semelhante se passar em listas aninhadas.Você pode ler mais sobre por que isso funciona aqui.
fonte
Como mencionado neste post pandas: como armazenar uma lista em um dataframe? ; os dtypes no dataframe podem influenciar os resultados, bem como chamar um dataframe ou não ser atribuído.
fonte
Solução rápida
Simplesmente coloque a lista dentro de uma nova lista, como feito para col2 no quadro de dados abaixo. A razão de funcionar é que o python pega a lista externa (de listas) e a converte em uma coluna como se ela contivesse itens escalares normais, que são listas em nosso caso e não escalares normais.
fonte
Também recebendo
ValueError: Must have equal len keys and value when setting with an iterable
,usar .at em vez de .loc não fez nenhuma diferença no meu caso, mas impor o tipo de dados da coluna do dataframe funcionou:
Então eu poderia definir listas, matrizes numpy e todos os tipos de coisas como valores de uma única célula em meus dataframes.
fonte