Python pandas insérer la liste dans une cellule
j'ai une liste 'abc' et un dataframe 'df':
abc = ['foo', 'bar']
df =
A B
0 12 NaN
1 23 NaN
je veux insérer la liste dans la cellule 1B, donc je veux ce résultat:
A B
0 12 NaN
1 23 ['foo', 'bar']
Comment puis-je faire ça?
1) Si j'utilise ceci:
df.ix[1,'B'] = abc
je reçois le message d'erreur suivant:
ValueError: Must have equal len keys and value when setting with an iterable
parce qu'il essaie d'insérer la liste (qui comporte deux éléments) dans une ligne / colonne, mais pas dans une cellule.
2) Si j'utilise ceci:
df.ix[1,'B'] = [abc]
insère alors une liste qui n'a qu'un seul élément qui est la liste" abc " ( [['foo', 'bar']]
).
3) Si j'utilise ceci:
df.ix[1,'B'] = ', '.join(abc)
puis insère une chaîne de caractères: ( foo, bar
) mais pas une liste.
4) Si j'utilise ceci:
df.ix[1,'B'] = [', '.join(abc)]
ensuite il insère une liste mais il n'a qu'un élément ( ['foo, bar']
) mais pas deux comme je veux ( ['foo', 'bar']
).
Merci pour l'aide!
MODIFIER
ma nouvelle base de données et l'ancienne liste:
abc = ['foo', 'bar']
df2 =
A B C
0 12 NaN 'bla'
1 23 NaN 'bla bla'
une autre dataframe:
df3 =
A B C D
0 12 NaN 'bla' ['item1', 'item2']
1 23 NaN 'bla bla' [11, 12, 13]
je veux insérer la liste" abc "dans df2.loc[1,'B']
et/ou df3.loc[1,'B']
.
si le datagramme a des colonnes seulement avec des valeurs entières et/ou des valeurs NaN et / ou des valeurs de liste puis l'insertion d'une liste dans une cellule fonctionne parfaitement. Si la dataframe a des colonnes seulement avec des valeurs de chaîne et/ou des valeurs de NaN et/ou des valeurs de liste, alors l'insertion d'une liste dans une cellule fonctionne parfaitement. Mais si le datagramme a des colonnes avec des valeurs entières et des valeurs de chaîne et d'autres colonnes alors le message d'erreur apparaît si j'utilise ceci: df2.loc[1,'B'] = abc
ou df3.loc[1,'B'] = abc
.
une autre dataframe:
df4 =
A B
0 'bla' NaN
1 'bla bla' NaN
ces inserts fonctionnent parfaitement: df.loc[1,'B'] = abc
ou df4.loc[1,'B'] = abc
.
3 réponses
mise à jour 2017
depuis set_value
a été déprécié depuis la version 0.21.0, vous devez maintenant utiliser at
. Il peut insérer une liste dans une cellule sans soulever un ValueError
comme loc
fait. Je pense que c'est parce que at
"toujours se réfère à une seule valeur, tandis que loc
peut se référer à des valeurs aussi bien que des lignes et des colonnes.
df = pd.DataFrame(data={'A': [1, 2, 3], 'B': ['x', 'y', 'z']})
df.at[1, 'B'] = ['m', 'n']
df =
A B
0 1 x
1 2 [m, n]
2 3 z
df3.set_value(1, 'B', abc)
fonctionne pour toute base de données. Prenez soin du type de données de la colonne 'B'. Par exemple. une liste ne peut pas être insérée dans une colonne flottante, dans ce cas df['B'] = df['B'].astype(object)
peut aider.
comme mentionné dans ce post pandas: comment stocker une liste dans une base de données? ; les dtypes dans la dataframe peuvent influencer les résultats, en plus d'appeler une dataframe ou de ne pas lui être assigné.