Convertir marco de datos pandas a serie


Soy algo nuevo con los pandas. Tengo un marco de datos pandas que es 1 fila por 23 columnas.

Quiero convertir esto en una serie? Me pregunto cuál es la forma más pitónica de hacer esto.

He intentado pd.Series(myResults), pero se queja ValueError: cannot copy sequence with size 23 to array axis with dimension 1. No es lo suficientemente inteligente como para darse cuenta de que sigue siendo un "vector" en términos matemáticos.

Gracias!

Author: user1357015, 2015-10-21

3 answers

No es lo suficientemente inteligente como para darse cuenta de que sigue siendo un "vector" en términos matemáticos.

Digamos más bien que es lo suficientemente inteligente como para reconocer una diferencia en la dimensionalidad. :-)

Creo que lo más simple que puede hacer es seleccionar esa fila posicionalmente usando iloc, lo que le da una Serie con las columnas como el nuevo índice y los valores como los valores:

>>> df = pd.DataFrame([list(range(5))], columns=["a{}".format(i) for i in range(5)])
>>> df
   a0  a1  a2  a3  a4
0   0   1   2   3   4
>>> df.iloc[0]
a0    0
a1    1
a2    2
a3    3
a4    4
Name: 0, dtype: int64
>>> type(_)
<class 'pandas.core.series.Series'>
 28
Author: DSM,
Warning: date(): Invalid date.timezone value 'Europe/Kyiv', we selected the timezone 'UTC' for now. in /var/www/agent_stack/data/www/ajaxhispano.com/template/agent.layouts/content.php on line 61
2015-10-20 21:21:08

Puede transponer el dataframe de una sola fila (que aún resulta en un dataframe) y luego comprimir los resultados en una serie (el inverso de to_frame).

df = pd.DataFrame([list(range(5))], columns=["a{}".format(i) for i in range(5)])

>>> df.T.squeeze()
a0    0
a1    1
a2    2
a3    3
a4    4
Name: 0, dtype: int64

Nota: Para acomodar el punto planteado por @IanS (aunque no esté en la pregunta del OP), pruebe el tamaño del dataframe. Estoy asumiendo que df es un dataframe, pero los casos de borde son un dataframe vacío, un dataframe de shape (1, 1) y un dataframe con más de una fila en cuyo caso el uso deben implementar su funcionalidad deseada.

if df.empty:
    # Empty dataframe, so convert to empty Series.
    result = pd.Series()
elif df.shape == (1, 1)
    # DataFrame with one value, so convert to series with appropriate index.
    result = pd.Series(df.iat[0, 0], index=df.columns)
elif len(df) == 1:
    # Convert to series per OP's question.
    result = df.T.squeeze()
else:
    # Dataframe with multiple rows.  Implement desired behavior.
    pass

Esto también se puede simplificar en la línea de la respuesta proporcionada por @themachinist.

if len(df) > 1:
    # Dataframe with multiple rows.  Implement desired behavior.
    pass
else:
    result = pd.Series() if df.empty else df.iloc[0, :]
 21
Author: Alexander,
Warning: date(): Invalid date.timezone value 'Europe/Kyiv', we selected the timezone 'UTC' for now. in /var/www/agent_stack/data/www/ajaxhispano.com/template/agent.layouts/content.php on line 61
2018-04-11 18:31:53

Puede recuperar la serie cortando su dataframe utilizando uno de estos dos métodos:

Http://pandas.pydata.org/pandas-docs/stable/generated/pandas.DataFrame.iloc.html http://pandas.pydata.org/pandas-docs/stable/generated/pandas.DataFrame.loc.html

import pandas as pd
import numpy as np
df = pd.DataFrame(data=np.random.randn(1,8))

series1=df.iloc[0,:]
type(series1)
pandas.core.series.Series
 15
Author: themachinist,
Warning: date(): Invalid date.timezone value 'Europe/Kyiv', we selected the timezone 'UTC' for now. in /var/www/agent_stack/data/www/ajaxhispano.com/template/agent.layouts/content.php on line 61
2015-10-20 21:33:09