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 .

47
demandé sur Cleb 2014-10-21 13:26:25

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
49
répondu Michael Hays 2017-11-29 08:45:39

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.

32
répondu ragesz 2014-10-22 14:44:05

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é.

2
répondu Ando Jurai 2017-12-16 13:40:08