2015-12-14 5 views
0

Disons que j'ai une trame de données. Avec plusieurs colonnes (par exemple, « A », « B ») En utilisant le code suivant, je veux faire une nouvelle trame de données basée sur une seule colonne:Pourquoi l'objet dataframe est-il converti en objet TimeSeries

df2 = df1['A'] 

Cependant, quand je le fais, la trame de données est soudainement converti en TimeSeries

In [5] print type (df2)<class 'pandas.core.series.Series'> 

Très très étrange ... quelqu'un peut-il m'expliquer pourquoi cela se produit ...?

Répondre

2

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.

+0

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

+1

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

+0

@unutbu, le découpage est très bien expliqué. Il vaudrait la peine d'ajouter à la réponse – Leb

1

Oui, df1['A'] est une série Pandas, donc l'assigner à df2 donnera une série pandas.

pandas.DataFrame(df.A) - crée un nouveau pandas géants dataframe