Estou tentando atribuir uma célula de dataframe com uma lista aninhada:
df.loc['y','A'] = [[2]]
Entretanto, o valor real atribuído é [2]
.
Funciona como esperado para [2], [[[2]]], [[[[2]]]]
, mas não para[[2]]
Veja o código a seguir:
import pandas as pd
import numpy as np
df = pd.DataFrame({"A": [[1], [[2]], [[[3]]], [[[[4]]]], np.array([[2]]), np.array([[[2]]]), [[1],[2]]],
"B": [[1], [[2]], [[[3]]], [[[[4]]]], np.array([[2]]), np.array([[[2]]]), [[1],[2]]],
"C": [1,2,3,4,5,6,7]
},
index=["x", "y", "z", "w","a","b","c"])
# initial assing works
print(df)
df.loc['x','A'] = [1] # good
df.loc['y','A'] = [[2]] # buggy, actual assigned value [2]
df.loc['z','A'] = [[[3]]] # good
df.loc['w','A'] = [[[[4]]]] #good
df.loc['a','A'] = np.array([[2]], dtype=object) # buggy, actual assign value [2]
df.loc['b','A'] = np.array([[[2]]], dtype=object) # good
#df.loc['b','A'] = [1,2] # error: Must have equal len keys and value when setting with an iterable
df.loc['c','A'] = [[1],[2]] # buggy, actual assigned value [1,2]
print(df)
A saída:
A B C
x [1] [1] 1
y [[2]] [[2]] 2
z [[[3]]] [[[3]]] 3
w [[[[4]]]] [[[[4]]]] 4
a [[2]] [[2]] 5
b [[[2]]] [[[2]]] 6
c [[1], [2]] [[1], [2]] 7
A B C
x [1] [1] 1
y [2] [[2]] 2
z [[[3]]] [[[3]]] 3
w [[[[4]]]] [[[[4]]]] 4
a [2] [[2]] 5
b [[[2]]] [[[2]]] 6
c [1, 2] [[1], [2]] 7
O que é ainda mais estranho é que, se removermos a coluna "C", não haverá nenhum bug, nenhum erro em todos os comentários de código acima.
O Pandas descompacta automaticamente listas de elementos únicos devido à inferência de tipo. Esse problema é influenciado pela coluna "C" (dtype inteiro), que altera o comportamento do dtype.
Força
dtype=object
na coluna "A":Isso evita o desempacotamento implícito de listas aninhadas.
Use
.at[...]
em vez de.loc[...]
para tarefas únicas:.at[...]
evita a inferência de dtype interno do Pandas.Remova a coluna "C" se não for necessária. Sua presença influencia a conversão automática de tipo.