tutorial functions documentacion python pandas

python - functions - Los pandas que seleccionan por etiqueta a veces devuelven series, a veces devuelven el marco de datos



python pandas download windows (4)

Debo admitir que el comportamiento es inconsistente, pero creo que es fácil imaginar casos en los que esto sea conveniente. De todos modos, para obtener un DataFrame cada vez, simplemente pase una lista al loc . Hay otras formas, pero en mi opinión esta es la más limpia.

In [2]: type(df.loc[[3]]) Out[2]: pandas.core.frame.DataFrame In [3]: type(df.loc[[1]]) Out[3]: pandas.core.frame.DataFrame

En Pandas, cuando selecciono una etiqueta que solo tiene una entrada en el índice, recupero una serie, pero cuando selecciono una entrada que tiene más de una entrada, obtengo un marco de datos.

¿Porqué es eso? ¿Hay alguna forma de garantizar que siempre obtenga un marco de datos?

In [1]: import pandas as pd In [2]: df = pd.DataFrame(data=range(5), index=[1, 2, 3, 3, 3]) In [3]: type(df.loc[3]) Out[3]: pandas.core.frame.DataFrame In [4]: type(df.loc[1]) Out[4]: pandas.core.series.Series


Si el objetivo es obtener un subconjunto del conjunto de datos utilizando el índice, es mejor evitar el uso de loc o iloc . En su lugar, debe usar una sintaxis similar a esta:

df = pd.DataFrame(data=range(5), index=[1, 2, 3, 3, 3]) result = df[df.index == 3] isinstance(result, pd.DataFrame) # True result = df[df.index == 1] isinstance(result, pd.DataFrame) # True


Tienes un índice con tres ítems de índice 3 . Por este motivo, df.loc[3] devolverá un marco de datos.

El motivo es que no especificas la columna. Así que df.loc[3] selecciona tres elementos de todas las columnas (que es la columna 0 ), mientras que df.loc[3,0] devolverá una serie. Por ejemplo, df.loc[1:2] también devuelve un marco de datos, porque corta las filas.

Al seleccionar una sola fila (como df.loc[1] ) se devuelve una serie con los nombres de las columnas como índice.

Si quiere asegurarse de tener siempre un DataFrame, puede cortar como df.loc[1:1] . Otra opción es la indexación booleana ( df.loc[df.index==1] ) o el método take ( df.take([0]) , ¡pero esta ubicación usada no está etiquetada!).


Usted escribió en un comentario a la respuesta de joris:

"No entiendo la decisión de diseño para que las filas individuales se conviertan en una serie. ¿Por qué no un marco de datos con una fila?"

Una sola fila no se convierte en una serie.
Es una serie: No, I don''t think so, in fact; see the edit No, I don''t think so, in fact; see the edit

La mejor manera de pensar sobre las estructuras de datos de pandas es como contenedores flexibles para datos dimensionales inferiores. Por ejemplo, DataFrame es un contenedor para Series, y Panel es un contenedor para objetos DataFrame. Nos gustaría poder insertar y eliminar objetos de estos contenedores de forma similar a un diccionario.

http://pandas.pydata.org/pandas-docs/stable/overview.html#why-more-than-1-data-structure

El modelo de datos de los objetos Pandas ha sido elegido así. La razón ciertamente radica en el hecho de que asegura algunas ventajas que no conozco (no entiendo completamente la última oración de la cita, tal vez sea la razón)

.

Editar: no estoy de acuerdo conmigo

Un DataFrame no puede estar compuesto de elementos que serían Serie, porque el siguiente código da el mismo tipo de "Serie" también para una fila como para una columna:

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])

resultado

-------- 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''>

Por lo tanto, no tiene sentido pretender que un DataFrame está compuesto de Series porque se suponía que estas series serían: ¿columnas o filas? Pregunta estúpida y visión

.

Entonces, ¿qué es un DataFrame?

En la versión anterior de esta respuesta, hice esta pregunta, tratando de encontrar la respuesta al Why is that? parte de la pregunta de OP y las single rows to get converted into a series - why not a data frame with one row? interrogación similares single rows to get converted into a series - why not a data frame with one row? en uno de sus comentarios,
mientras que Is there a way to ensure I always get back a data frame? parte ha sido respondida por Dan Allan.

Luego, como los documentos de los Pandas citados anteriormente dicen que las estructuras de datos de los pandas se ven mejor como contenedores de datos dimensionales inferiores, me pareció que la comprensión del por qué se encontraría en las características de la estructura de los DataFrame.

Sin embargo, me di cuenta de que este consejo citado no debe tomarse como una descripción precisa de la naturaleza de las estructuras de datos de Pandas.
Este consejo no significa que un DataFrame es un contenedor de Series.
Expresa que la representación mental de un DataFrame como un contenedor de Series (ya sean filas o columnas según la opción considerada en un momento dado de un razonamiento) es una buena manera de considerar los DataFrames, incluso si no es estrictamente el caso en la realidad. "Bueno", lo que significa que esta visión permite utilizar DataFrames con eficacia. Eso es todo.

.

Entonces, ¿qué es un objeto DataFrame?

La clase DataFrame produce instancias que tienen una estructura particular originada en la clase base NDFrame , derivada de la clase base PandasContainer que también es una clase padre de la clase Series .
Tenga en cuenta que esto es correcto para Pandas hasta la versión 0.12. En la próxima versión 0.13, la serie también se derivará solo de la clase NDFrame .

# 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__

resultado

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''>,)

Por lo tanto, tengo entendido que una instancia de DataFrame tiene determinados métodos que se han diseñado para controlar la forma en que se extraen los datos de las filas y columnas.

Las formas en que funcionan estos métodos de extracción se describen en esta página: http://pandas.pydata.org/pandas-docs/stable/indexing.html#indexing
Encontramos en él el método dado por Dan Allan y otros métodos.

¿Por qué estos métodos de extracción han sido elaborados como fueron?
Eso es cierto porque han sido evaluados como los que ofrecen mejores posibilidades y facilidad en el análisis de datos.
Es precisamente lo que se expresa en esta oración:

La mejor manera de pensar sobre las estructuras de datos de pandas es como contenedores flexibles para datos dimensionales inferiores.

El motivo de la extracción de datos de una instancia de DataFRame no reside en su estructura, sino en el por qué de esta estructura. Supongo que la estructura y el funcionamiento de la estructura de datos de los Pandas se han cincelado para ser lo más intelectualmente intuitivos posible, y que para comprender los detalles, uno debe leer el blog de Wes McKinney.