Eu sou um pouco novo para os pandas. Eu tenho um quadro de dados do pandas que tem 1 linha por 23 colunas.
Eu quero converter isso em uma série? Estou me perguntando qual é a maneira mais python de fazer isso?
Já tentei, pd.Series(myResults)
mas reclama ValueError: cannot copy sequence with size 23 to array axis with dimension 1
. Não é inteligente o suficiente para perceber que ainda é um "vetor" em termos matemáticos.
Obrigado!
df.T
df.T
não produz uma série, porém, apenas um DataFrame transposto.df.iloc
é que, se você tiver um df vazio, isso gerará umIndexError
. Para evitar isso, após transpor seu df, use odf.squeeze
método. Ref. para pandas.pydata.org/pandas-docs/stable/reference/api/…Você pode transpor o dataframe de uma única linha (que ainda resulta em um dataframe) e, em seguida, comprimir os resultados em uma série (o 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 o ponto levantado por @IanS (mesmo que não esteja na pergunta do OP), teste o tamanho do dataframe. Estou assumindo que
df
é um dataframe, mas os casos extremos são um dataframe vazio, um dataframe de forma (1, 1) e um dataframe com mais de uma linha, caso em que o uso deve implementar a funcionalidade desejada.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
Isso também pode ser simplificado ao longo das linhas da resposta fornecida 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, :]
fonte
squeeze
. Para um dataframe de forma,(1, 1)
ele retornará, não uma série de comprimento 1, mas um escalar numpy. Isso levou a um bug difícil de detectar ao usarsqueeze
em objetos de comprimento desconhecido (por exemplo, comgroupby
).to_frame
nãoto_series
oupd.Series(df)
...?.T
df.squeeze(axis=0)
oudf.squeeze(axis=1)
(dependendo do eixo que você deseja conservar) para evitar issoVocê pode recuperar a série cortando seu dataframe usando um destes dois 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
fonte
Outra maneira -
Suponha que myResult seja o dataFrame que contém seus dados na forma de 1 coluna e 23 linhas
// 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 maneira semelhante, você pode obter séries do Dataframe com várias colunas.
fonte
Você também pode usar stack ()
df= DataFrame([list(range(5))], columns = [“a{}”.format(I) for I in range(5)])
Depois de executar o df, execute:
Você obtém seu dataframe em série
fonte
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)
Isso fornece um dataframe com índice como nome da coluna de dados e todos os dados estão presentes na coluna "valores"
fonte