Vous avez écrit dans un commentaire à la réponse de Joris:
"Je ne comprends pas la décision de conception de convertir des lignes uniques en série - pourquoi pas un bloc de données avec une ligne?"
Une seule ligne n'est pas convertie en série.
Il EST une série:No, I don't think so, in fact; see the edit
La meilleure façon de penser aux structures de données pandas est de créer des conteneurs flexibles pour des données de moindre dimension. Par exemple, DataFrame est un conteneur pour Series et Panel est un conteneur pour les objets DataFrame. Nous aimerions pouvoir insérer et supprimer des objets de ces conteneurs à la manière d'un dictionnaire.
http://pandas.pydata.org/pandas-docs/stable/overview.html#why-more-than-1-data-structure
Le modèle de données des objets Pandas a été choisi comme ça. La raison réside certainement dans le fait que cela garantit des avantages que je ne connais pas (je ne comprends pas complètement la dernière phrase de la citation, peut-être que c'est la raison)
.
Edit: je ne suis pas d'accord avec moi
Une trame de données ne peut pas être composé d'éléments qui être série, car le code suivant donne le même type « série » et pour une ligne que pour une colonne:
import pandas as pd
df = pd.DataFrame(data=[11,12,13], index=[2, 3, 3])
print '-------- df -------------'
print df
print '\n------- df.loc[2] --------'
print df.loc[2]
print 'type(df.loc[1]) : ',type(df.loc[2])
print '\n--------- df[0] ----------'
print df[0]
print 'type(df[0]) : ',type(df[0])
résultat
-------- df -------------
0
2 11
3 12
3 13
------- df.loc[2] --------
0 11
Name: 2, dtype: int64
type(df.loc[1]) : <class 'pandas.core.series.Series'>
--------- df[0] ----------
2 11
3 12
3 13
Name: 0, dtype: int64
type(df[0]) : <class 'pandas.core.series.Series'>
Donc, il n'y a aucun sens à prétendre qu'un DataFrame est composé de Series parce que ce que cesdites Series seraient supposées être: des colonnes ou des lignes? Question et vision stupides.
.
Alors qu'est-ce qu'un DataFrame?
Dans la version précédente de cette réponse, j'ai posé cette question, en essayant de trouver la réponse à la Why is that?
partie de la question du PO et à l'interrogatoire similaire single rows to get converted into a series - why not a data frame with one row?
dans l'un de ses commentaires,
alors que la Is there a way to ensure I always get back a data frame?
partie a été répondue par Dan Allan.
Ensuite, comme les documents des Pandas cités ci-dessus indiquent que les structures de données des pandas sont mieux vues comme des conteneurs de données de dimension inférieure, il m'a semblé que la compréhension du pourquoi se trouverait dans les caractéristiques de la nature des structures DataFrame.
Cependant, j'ai réalisé que cet avis cité ne doit pas être considéré comme une description précise de la nature des structures de données de Pandas.
Ce conseil ne signifie pas qu'un DataFrame est un conteneur de Series.
Il exprime que la représentation mentale d'un DataFrame comme conteneur de Series (soit des lignes, soit des colonnes selon l'option considérée à un moment d'un raisonnement) est un bon moyen de considérer les DataFrames, même si ce n'est pas strictement le cas dans la réalité. «Bon» signifie que cette vision permet d'utiliser les DataFrames avec efficacité. C'est tout.
.
Alors qu'est-ce qu'un objet DataFrame?
La classe DataFrame produit des instances qui ont une structure particulière issue de la classe de base NDFrame , elle-même dérivée de la classe de base PandasContainer qui est également une classe parente de la classe Series .
Notez que cela est correct pour Pandas jusqu'à la version 0.12. Dans la prochaine version 0.13, Series dérivera également de la classe NDFrame uniquement.
# with pandas 0.12
from pandas import Series
print 'Series :\n',Series
print 'Series.__bases__ :\n',Series.__bases__
from pandas import DataFrame
print '\nDataFrame :\n',DataFrame
print 'DataFrame.__bases__ :\n',DataFrame.__bases__
print '\n-------------------'
from pandas.core.generic import NDFrame
print '\nNDFrame.__bases__ :\n',NDFrame.__bases__
from pandas.core.generic import PandasContainer
print '\nPandasContainer.__bases__ :\n',PandasContainer.__bases__
from pandas.core.base import PandasObject
print '\nPandasObject.__bases__ :\n',PandasObject.__bases__
from pandas.core.base import StringMixin
print '\nStringMixin.__bases__ :\n',StringMixin.__bases__
résultat
Series :
<class 'pandas.core.series.Series'>
Series.__bases__ :
(<class 'pandas.core.generic.PandasContainer'>, <type 'numpy.ndarray'>)
DataFrame :
<class 'pandas.core.frame.DataFrame'>
DataFrame.__bases__ :
(<class 'pandas.core.generic.NDFrame'>,)
-------------------
NDFrame.__bases__ :
(<class 'pandas.core.generic.PandasContainer'>,)
PandasContainer.__bases__ :
(<class 'pandas.core.base.PandasObject'>,)
PandasObject.__bases__ :
(<class 'pandas.core.base.StringMixin'>,)
StringMixin.__bases__ :
(<type 'object'>,)
Donc, je crois comprendre maintenant qu'une instance de DataFrame a certaines méthodes qui ont été conçues afin de contrôler la façon dont les données sont extraites des lignes et des colonnes.
Le fonctionnement de ces méthodes d'extraction est décrit dans cette page:
http://pandas.pydata.org/pandas-docs/stable/indexing.html#indexing
On y retrouve la méthode donnée par Dan Allan et d'autres méthodes.
Pourquoi ces méthodes d'extraction ont-elles été élaborées telles quelles?
C'est certainement parce qu'ils ont été évalués comme ceux offrant les meilleures possibilités et la facilité d'analyse des données.
C'est précisément ce qui est exprimé dans cette phrase:
La meilleure façon de penser aux structures de données pandas est de créer des conteneurs flexibles pour des données de moindre dimension.
Le pourquoi de l'extraction des données d'une instance DataFRame ne réside pas dans sa structure, il réside dans le pourquoi de cette structure. Je suppose que la structure et le fonctionnement de la structure de données des Pandas ont été ciselés afin d'être le plus intellectuellement intuitif possible, et que pour comprendre les détails, il faut lire le blog de Wes McKinney.