¿Cuál es la diferencia entre una serie de pandas y un DataFrame de columna única?

168

¿Por qué los pandas hacen una distinción entre ay Seriesuna sola columna DataFrame?
En otras palabras: ¿cuál es la razón de la existencia de la Seriesclase?

Principalmente estoy usando series de tiempo con índice de fecha y hora, tal vez eso ayude a establecer el contexto.

saroele
fuente
Bueno, obviamente son diferentes, creo que se refiere a ciertas operaciones que aún devuelven un marco de datos, ya sea porque solo tiene un marco de datos de una sola columna o porque la operación da como resultado un marco de datos de una sola columna. Sin embargo, al seleccionar una sola columna no hay ambigüedad y esto se descompone en una Serie. Debe mostrar un código de muestra para explicar cuál es su problema.
EdChum
Posiblemente relacionado: stackoverflow.com/questions/16782323/…
EdChum
66
El problema principal es que no veo la necesidad de un objeto Serie, con diferentes métodos.
saroele
Por un lado, hay una diferencia de espacio de nombres. Las series solo tienen un nombre de nivel superior, los marcos de datos tienen un nivel superior y un nombre de columna. Eso puede conducir a diferencias significativas en la sintaxis para procesar / crear una nueva serie frente a una nueva columna.
JohnE
44
Por lo que puedo decir, esta pregunta aún debe ser respondida. Aunque uno puede pensar DataFramecomo un dictde Series(aunque esa no es la implementación actual), todavía no está claro por qué alguna vez devolvería un Seriesobjeto en lugar de un DataFrame(es decir, conceptualmente un dictcon una entrada).
Alex

Respuestas:

190

Citando los documentos de Pandas

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

Estructura de datos tabulares bidimensionales de tamaño variable y potencialmente heterogénea con ejes etiquetados (filas y columnas). Las operaciones aritméticas se alinean en las etiquetas de fila y columna. Puede considerarse como un contenedor tipo dict para objetos de la serie. La estructura de datos primaria de los pandas.

Entonces, la Serie es la estructura de datos para una sola columna de aDataFrame , no solo conceptualmente, sino literalmente, es decir, los datos en a DataFramese almacenan realmente en la memoria como una colección de Series.

Análogamente: necesitamos listas y matrices, porque las matrices se construyen con listas. Las matrices de una sola fila, aunque son equivalentes a las listas en funcionalidad, todavía no pueden existir sin las listas de las que están compuestas.

Ambos tienen API extremadamente similares, pero encontrará que los DataFramemétodos siempre atienden a la posibilidad de que tenga más de una columna. Y, por supuesto, siempre puede agregar otro Series(u objeto equivalente) a a DataFrame, mientras que agregar un Seriesa otro Seriesimplica crear un DataFrame.

PythonNut
fuente
2
Gracias por tu respuesta. Mi pregunta se inspiró en un error en mi código cuando una selección en un marco de datos de repente devolvió una serie y no pude acceder al atributo de columnas. No soy el único confundido: stackoverflow.com/questions/16782323/…
saroele
Veo. ¿Quizás ayudaría si tuvieran un __repr__comportamiento diferente , por lo que no puedes confundirlos?
PythonNut
66
No puede concluir nada sobre la estructura de datos interna real de a DataFramefrom Can be thought of as a dict-like container for Series objects. De hecho, actualmente está almacenado como un BlockManager(que es un detalle de implementación en el que no debe confiar).
timdiels
1
Todavía estoy confundido, entonces, ¿cuándo usaría un marco de datos de una sola columna en lugar de una serie?
dhiraj suvarna
44
Puedo ser pedante, pero no veo respondida la pregunta del OP de POR QUÉ existen las series. Veo una respuesta que describe la relación entre series y marcos de datos, pero no una respuesta que explique por qué deberíamos querer tener una serie como un tipo de datos separado en lugar de ser un caso especial de un marco de datos (es decir, uno con una sola columna).
MightyCurious
14

del pandas doc http://pandas.pydata.org/pandas-docs/stable/dsintro.html La serie es una matriz etiquetada unidimensional capaz de contener cualquier tipo de datos. Para leer datos en forma de serie panda:

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

DataFrame es una estructura de datos etiquetados bidimensionales con columnas de tipos potencialmente diferentes.

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

En ambos el índice anterior es la lista

por ejemplo: tengo un archivo csv con los siguientes datos:

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

Para leer los datos anteriores como serie y marco de datos:

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)

salida:

>>> d
BR           Brazil
RU           Russia
IN            India

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

salida:

>>> df
      area
BR   12015
RU     457
IN  457787
Umesh Kaushik
fuente
2
Si alguien se esfuerza por votar en contra, ¿podría también tratar de mencionar una razón?
Umesh Kaushik
2
No voté en contra, pero su código no funciona. Es posible que desee cambiar file_dataa brics, agregar una línea de EE. UU. Al csv y cambiar ['BR'....'US']a brics.index. Quizás correcto pupuplation.
RolfBly
@RolfBly: Gracias por señalar esos errores. Fue una tontería de mi parte hacerlos. Los he cambiado ¡Gracias! Y con respecto a la lectura de que solo es un ejemplo, tomé valores aleatorios.
Umesh Kaushik
4

La serie es un objeto unidimensional que puede contener cualquier tipo de datos, como enteros, flotantes y cadenas, por ejemplo

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

0 A
1 B
2 C

La primera columna de la serie se conoce como índice, es decir, 0,1,2, la segunda columna son sus datos reales, es decir, A, B, C

DataFrames es un objeto bidimensional que puede contener series, listas y diccionarios.

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

Series es una matriz etiquetada unidimensional capaz de contener cualquier tipo de datos (enteros, cadenas, números de coma flotante, objetos Python, etc.). Las etiquetas de los ejes se denominan colectivamente índice. El método básico para crear una serie es llamar a:

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

DataFrame es una estructura de datos etiquetados bidimensionales con columnas de tipos potencialmente diferentes. Puede pensarlo como una hoja de cálculo o una tabla SQL, o un resumen de objetos de la Serie.

 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
fuente
0

Importar datos de autos

import pandas as pd

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

Así es como se ve el archivo cars.csv.

Imprima la columna drives_right como Serie:

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 versión de soporte único proporciona una Serie Pandas, la versión de soporte doble proporciona un Marco de datos Pandas.

Imprima la columna drives_right como DataFrame

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

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

Agregar una serie a otra serie crea un marco de datos.

abhishek_7081
fuente
1
Muchas gracias por editar. Se ve mucho mejor ahora. @Zoe
abhishek_7081