python - index - Convierta el marco de datos de pandas a series
pandas series to list (4)
Soy algo nuevo para los pandas. Tengo un marco de datos de pandas que es de 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.
Intenté
pd.Series(myResults)
pero se queja de
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!
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 dimensionalidad. :-)
Creo que lo más simple que puede hacer es seleccionar esa fila posicionalmente usando
iloc
, que le brinda 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''>
Puede recuperar la serie cortando su marco de datos 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
Puede transponer el marco de datos de una sola fila (que todavía da como resultado un marco de datos) y luego
squeeze
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() # Or more simply, df.squeeze() for a single row dataframe.
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 marco de datos.
Supongo que
df
es un marco de datos, pero los casos de borde son un marco de datos vacío, un marco de datos de forma (1, 1) y un marco de datos con más de una fila, en cuyo caso el uso debe 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 a lo largo de las líneas 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, :]
De otra manera -
Suponga que myResult es el dataFrame que contiene sus datos en forma de 1 columna y 23 filas
// label your columns by passing a list of names
myResult.columns = [''firstCol'']
// fetch the column in this way, which will return you a series
myResult = myResult[''firstCol'']
print(type(myResult))
De manera similar, puede obtener series de Dataframe con múltiples columnas.