df1['A']
renvoie une série. df1[['A']]
renvoie un DataFrame.
Le découpage se comporte différemment selon le type d'objet que vous passez entre les supports .
Si vous découpez une trame de données, df
, avec une chaîne, la trame de données essaie de trouver la chaîne dans df.columns
et si elle réussit, retourne la colonne en tant que série.
Si vous coupez df
une liste (de chaînes), la trame de données essaie de trouver chacune des chaînes dans df.columns
et si elle réussit, renvoie les colonnes comme nouvelle trame de données. Si la liste contient uniquement une chaîne, vous obtenez un DataFrame avec une seule colonne.
Lorsque le découpage est utilisé dans une mission , df['B'] = xyz
appels df.__setitem__('B', xyz)
. Le __setitem__
DataFrame a été implémenté à modifier df
lui-même. L'affectation ne renvoie pas de valeur, mais elle modifie df
en place.
Lorsque le découpage est utilisé dans une expression , df[xyz]
appels df.__getitem__(xyz)
. La méthode __getitem__
de DataFrame renvoie un type d'objet différent en fonction du type de xyz
.
aah, ok. J'ai utilisé la syntaxe '' df2 ['B'] '= df2 [' B '] 'pour assigner une nouvelle colonne dans une trame de données déjà ** existante **. Dans ce scénario, la trame de données est restée une trame de données. Mais lorsque vous utilisez la syntaxe ci-dessus pour affecter les valeurs à une nouvelle variable, elle est automatiquement convertie en série ... –
Lorsque le découpage est utilisé dans un appel de ** affectation **, 'df2 ['B'] = xyz' 'df2 .__ setitem __ ('B', xyz)'. Le '__setitem__' du DataFrame a été implémenté pour modifier' df2' lui-même. L'affectation ne renvoie pas de valeur, mais modifie 'df2' en place. Lorsque le découpage est utilisé dans une ** expression **, 'df2 [xyz]' appelle 'df2 .__ getitem __ (xyz)'. La méthode '__getitem__' du DataFrame renvoie un type d'objet différent en fonction du type de' xyz'. – unutbu
@unutbu, le découpage est très bien expliqué. Il vaudrait la peine d'ajouter à la réponse – Leb