Soy algo nuevo en pandas. Tengo un marco de datos de pandas 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.
Lo 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!
df.T
df.T
embargo, no produce una serie, solo un DataFrame transpuesto.df.iloc
es que si tiene un df vacío, esto generará unIndexError
. Para evitar eso, después de transponer su df, use eldf.squeeze
método. Árbitro. a pandas.pydata.org/pandas-docs/stable/reference/api/…Puede transponer el marco de datos de una sola fila (que aún da como resultado un marco de datos) 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() # 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 extremos 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 la 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 según 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, :]
fuente
squeeze
. Para un marco de datos de forma(1, 1)
, devolverá, no una serie de longitud 1, sino un escalar numpy. Esto llevó a un error difícil de detectar cuando se usasqueeze
en objetos de longitud desconocida (por ejemplo, congroupby
).to_frame
noto_series
opd.Series(df)
...?.T
df.squeeze(axis=0)
odf.squeeze(axis=1)
(dependiendo del eje que quieras conservar) para evitar esoPuede 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
fuente
De otra manera -
Suponga que myResult es el dataFrame que contiene sus datos en forma de 1 col 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.
fuente
También puede usar stack ()
df= DataFrame([list(range(5))], columns = [“a{}”.format(I) for I in range(5)])
Después de ejecutar df, ejecute:
Obtienes tu marco de datos en serie
fuente
data = pd.DataFrame({"a":[1,2,3,34],"b":[5,6,7,8]}) new_data = pd.melt(data) new_data.set_index("variable", inplace=True)
Esto da un marco de datos con índice como nombre de columna de datos y todos los datos están presentes en la columna "valores"
fuente