Quelle est la différence entre une série Pandas et un DataFrame à une seule colonne?

169

Pourquoi les pandas font-ils une distinction entre une Serieset une colonne unique DataFrame?
En d'autres termes: quelle est la raison d'existence de la Seriesclasse?

J'utilise principalement des séries chronologiques avec un index datetime, cela aide peut-être à définir le contexte.

saroele
la source
Eh bien, ils sont différents évidemment, je pense que vous faites référence à certaines opérations qui renvoient toujours une trame de données soit parce que vous n'avez qu'une seule trame de données de colonne ou parce que l'opération aboutit à une trame de données à une seule colonne. Cependant, lors de la sélection d'une seule colonne, il n'y a pas d'ambiguïté et cela se décompose en une série. Vous devez afficher un exemple de code pour expliquer votre problème.
EdChum
6
Le problème principal est que je ne vois pas la nécessité d'un objet Series, avec des méthodes différentes.
saroele
D'une part, il existe une différence d'espace de noms. Les séries n'ont qu'un nom de niveau supérieur, les dataframes ont un niveau supérieur et un nom de colonne. Cela peut entraîner des différences significatives de syntaxe pour le traitement / la création d'une nouvelle série par rapport à une nouvelle colonne.
JohnE
4
Pour autant que je sache, cette question doit encore recevoir une réponse. Même si l'on peut penser DataFrameà un dictde Series(bien que ce ne soit pas l'implémentation actuelle), on ne sait toujours pas pourquoi vous retourneriez un Seriesobjet au lieu d'un DataFrame(c'est-à-dire conceptuellement un dictavec une entrée).
Alex

Réponses:

190

Citant les documents Pandas

pandas.DataFrame(data=None, index=None, columns=None, dtype=None, copy=False)

Structure de données tabulaire bidimensionnelle modifiable en taille, potentiellement hétérogène, avec des axes étiquetés (lignes et colonnes). Les opérations arithmétiques s'alignent sur les étiquettes de ligne et de colonne. Peut être considéré comme un conteneur de type dict pour les objets Series. La structure de données principale des pandas.

Ainsi, la série est la structure de données pour une seule colonne de aDataFrame , non seulement conceptuellement, mais littéralement, c'est-à-dire que les données de a DataFramesont en fait stockées en mémoire en tant que collection de Series.

De manière analogue: nous avons besoin à la fois de listes et de matrices, car les matrices sont construites avec des listes. Les matricies à une seule ligne, bien qu'équivalentes aux listes en fonctionnalité, ne peuvent toujours pas exister sans la ou les listes dont elles sont composées.

Ils ont tous les deux des API extrêmement similaires, mais vous constaterez que les DataFrameméthodes tiennent toujours compte de la possibilité que vous ayez plus d'une colonne. Et, bien sûr, vous pouvez toujours ajouter un autre Series(ou un objet équivalent) à un DataFrame, tandis que l'ajout d'un Seriesà un autre Seriesimplique la création d'un fichier DataFrame.

PythonNut
la source
2
Merci pour votre réponse. Ma question a été inspirée par un bogue dans mon code lorsqu'une sélection sur un dataframe a soudainement renvoyé une série à la place et que je n'ai pas pu accéder à l'attribut des colonnes. Je ne suis pas le seul confus: stackoverflow.com/questions/16782323/…
saroele
Je vois. Peut-être que cela aiderait s'ils avaient un __repr__comportement différent , de sorte que vous ne pouvez pas les mélanger?
PythonNut
6
Vous ne pouvez rien conclure sur la structure de données interne réelle d'un DataFramefrom Can be thought of as a dict-like container for Series objects. En fait, il est actuellement stocké en tant que BlockManager(ce qui est un détail d'implémentation sur lequel vous ne devriez pas vous fier).
timdiels
1
Je suis toujours confus, alors quand utiliserais-je un dataframe à colonne unique au lieu d'une série?
dhiraj suvarna
4
Je suis peut-être pédant, mais je ne vois pas de réponse à la question de l'OP de savoir pourquoi les séries existent. Je vois une réponse décrivant la relation entre les séries et les dataframes, mais pas une réponse expliquant pourquoi nous devrions vouloir avoir une série comme type de données séparé plutôt que d'être un cas particulier de dataframe (à savoir une avec une seule colonne).
MightyCurious
14

extrait du document pandas http://pandas.pydata.org/pandas-docs/stable/dsintro.html Series est un tableau étiqueté unidimensionnel capable de contenir n'importe quel type de données. Pour lire les données sous forme de série panda:

import pandas as pd
ds = pd.Series(data, index=index)

DataFrame est une structure de données étiquetée en 2 dimensions avec des colonnes de types potentiellement différents.

import pandas as pd
df = pd.DataFrame(data, index=index)

Dans les deux index ci-dessus se trouve la liste

par exemple: j'ai un fichier csv avec les données suivantes:

,country,popuplation,area,capital
BR,Brazil,10210,12015,Brasile
RU,Russia,1025,457,Moscow
IN,India,10458,457787,New Delhi

Pour lire les données ci-dessus sous forme de série et de bloc de données:

import pandas as pd
file_data = pd.read_csv("file_path", index_col=0)
d = pd.Series(file_data.country, index=['BR','RU','IN'] or index =  file_data.index)

production:

>>> d
BR           Brazil
RU           Russia
IN            India

df = pd.DataFrame(file_data.area, index=['BR','RU','IN'] or index = file_data.index )

production:

>>> df
      area
BR   12015
RU     457
IN  457787
Umesh Kaushik
la source
2
si quelqu'un fait l'effort de voter contre, pourriez-vous également essayer de mentionner une raison?
Umesh Kaushik
2
Je n'ai pas voté contre, mais votre code ne fonctionne pas. Vous souhaiterez peut-être changer file_dataen brics, ajouter une ligne US au csv et changer ['BR'....'US']en brics.index. Peut-être correct pupuplation.
RolfBly
@RolfBly: Merci d'avoir signalé ces erreurs. C'était idiot de ma part de les fabriquer. Je les ai changés. Je vous remercie! Et en ce qui concerne la lecture de cet exemple, j'ai pris des valeurs aléatoires.
Umesh Kaushik
4

La série est un objet unidimensionnel qui peut contenir n'importe quel type de données tel que des entiers, des flottants et des chaînes, par exemple

   import pandas as pd
   x = pd.Series([A,B,C]) 

0 A
1 B
2 C

La première colonne de Series est connue sous le nom d'index, c'est-à-dire 0,1,2 la deuxième colonne correspond à vos données réelles, c'est-à-dire A, B, C

DataFrames est un objet bidimensionnel pouvant contenir des séries, des listes, des dictionnaires

df=pd.DataFrame(rd(5,4),['A','B','C','D','E'],['W','X','Y','Z'])
syed irfan
la source
2

Series est un tableau étiqueté unidimensionnel capable de contenir n'importe quel type de données (entiers, chaînes, nombres à virgule flottante, objets Python, etc.). Les étiquettes des axes sont collectivement appelées index. La méthode de base pour créer une série est d'appeler:

s = pd.Series(data, index=index)

DataFrame est une structure de données étiquetée en 2 dimensions avec des colonnes de types potentiellement différents. Vous pouvez le considérer comme une feuille de calcul ou une table SQL, ou un dict d'objets Series.

 d = {'one' : pd.Series([1., 2., 3.], index=['a', 'b', 'c']),
 two' : pd.Series([1., 2., 3., 4.], index=['a', 'b', 'c', 'd'])}
 df = pd.DataFrame(d)
Yog
la source
0

Importer les données des voitures

import pandas as pd

cars = pd.read_csv('cars.csv', index_col = 0)

Voici à quoi ressemble le fichier cars.csv.

Imprimez la colonne drives_right comme Series:

print(cars.loc[:,"drives_right"])

    US      True
    AUS    False
    JAP    False
    IN     False
    RU      True
    MOR     True
    EG      True
    Name: drives_right, dtype: bool

La version à support simple donne une série Pandas, la version à support double donne un Pandas DataFrame.

Imprimer la colonne drives_right en tant que DataFrame

print(cars.loc[:,["drives_right"]])

         drives_right
    US           True
    AUS         False
    JAP         False
    IN          False
    RU           True
    MOR          True
    EG           True

L'ajout d'une série à une autre série crée un DataFrame.

abhishek_7081
la source
1
merci beaucoup pour la modification. Ça a l'air beaucoup mieux maintenant. @Zoe
abhishek_7081