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
car il essaie d'insérer la liste (qui a deux éléments) dans une ligne / colonne mais pas dans une cellule.
2) Si j'utilise ceci:
df.ix[1,'B'] = [abc]
puis il insère 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 il insère une chaîne: ( foo, bar
) mais pas une liste.
4) Si j'utilise ceci:
df.ix[1,'B'] = [', '.join(abc)]
puis il insère une liste mais il n'a qu'un seul élément ( ['foo, bar']
) mais pas deux comme je veux (['foo', 'bar']
).
Merci pour l'aide!
ÉDITER
Mon nouveau dataframe et l'ancienne liste:
abc = ['foo', 'bar']
df2 =
A B C
0 12 NaN 'bla'
1 23 NaN 'bla bla'
Un 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 / oudf3.loc[1,'B']
.
Si la trame de données contient des colonnes uniquement avec des valeurs entières et / ou des valeurs NaN et / ou des valeurs de liste, l'insertion d'une liste dans une cellule fonctionne parfaitement. Si le dataframe a des colonnes uniquement avec des valeurs de chaîne et / ou des valeurs NaN et / ou des valeurs de liste, l'insertion d'une liste dans une cellule fonctionne parfaitement. Mais si le dataframe a des colonnes avec des valeurs entières et de chaîne et d'autres colonnes, le message d'erreur apparaît si j'utilise ceci: df2.loc[1,'B'] = abc
oudf3.loc[1,'B'] = abc
.
Un 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
.
0.15.0
:df.loc[1,'b'] = ['foo','bar']
Réponses:
Comme il
set_value
est obsolète depuis la version 0.21.0, vous devez maintenant utiliserat
. Il peut insérer une liste dans une cellule sans lever unValueError
comme leloc
fait. Je pense que c'est parce que faitat
toujours référence à une seule valeur, alors queloc
peut faire référence à des valeurs ainsi qu'à des lignes et des colonnes.Vous devez également vous assurer que la colonne dans laquelle vous insérez a
dtype=object
. Par exemplela source
df = pd.DataFrame(data, dtype=object)
ValueError: setting an array element with a sequence.
; voir une réponse par @ cs95 si vous obtenez l'erreur.df3.set_value(1, 'B', abc)
fonctionne pour n'importe quel dataframe. 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 casdf['B'] = df['B'].astype(object)
peut aider.la source
Pandas> = 0,21
set_value
est obsolète. Vous pouvez maintenant utiliserDataFrame.at
pour définir par étiquette etDataFrame.iat
pour définir par position entière.Définition des valeurs de cellule avec
at
/iat
Si vous souhaitez définir une valeur dans la deuxième ligne du "B" pour une nouvelle liste, utilisez
DataFrane.at
:Vous pouvez également définir par position entière en utilisant
DataFrame.iat
Et si j'obtiens
ValueError: setting an array element with a sequence
?Je vais essayer de reproduire cela avec:
C'est parce que votre objet est de
float64
type d, alors que les listes sont desobject
s, il y a donc une incompatibilité. Dans cette situation, vous devez d'abord convertir la colonne en objet.Ensuite, ça marche:
Possible, mais Hacky
Encore plus farfelu, j'ai trouvé que vous pouvez pirater
DataFrame.loc
pour obtenir quelque chose de similaire si vous passez des listes imbriquées.Vous pouvez en savoir plus sur les raisons pour lesquelles cela fonctionne ici.
la source
Comme mentionné dans cet article pandas: comment stocker une liste dans un dataframe? ; les dtypes dans le dataframe peuvent influencer les résultats, ainsi que l'appel d'un dataframe ou ne pas lui être assigné.
la source
Travail rapide
Insérez simplement la liste dans une nouvelle liste, comme cela a été fait pour col2 dans le bloc de données ci-dessous. La raison pour laquelle cela fonctionne est que python prend la liste externe (des listes) et la convertit en une colonne comme si elle contenait des éléments scalaires normaux, qui sont des listes dans notre cas et non des scalaires normaux.
la source
Obtention également
ValueError: Must have equal len keys and value when setting with an iterable
,l'utilisation de .at plutôt que de .loc n'a fait aucune différence dans mon cas, mais l'application du type de données de la colonne dataframe a fait l'affaire:
Ensuite, je pourrais définir des listes, un tableau numpy et toutes sortes de choses en tant que valeurs de cellule unique dans mes dataframes.
la source