Converter dados do pandas em séries

101

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!

usuário1357015
fonte

Respostas:

66

Não é inteligente o suficiente para perceber que ainda é um "vetor" em termos matemáticos.

Em vez disso, diga que é inteligente o suficiente para reconhecer uma diferença na dimensionalidade. :-)

Acho que a coisa mais simples que você pode fazer é selecionar essa linha posicionalmente usando iloc, o que dá a você uma série com as colunas como o novo índice e os valores como os 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'>
DSM
fonte
2
Ou, de outra forma:df.T
ako de
15
@ako: df.Tnão produz uma série, porém, apenas um DataFrame transposto.
DSM de
@DSM. Isso é verdade, df.T.iloc [0]
Antonio Andrés
O único problema de usar df.ilocé que, se você tiver um df vazio, isso gerará um IndexError. Para evitar isso, após transpor seu df, use o df.squeezemétodo. Ref. para pandas.pydata.org/pandas-docs/stable/reference/api/…
Nicolas Fonteyne
62

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, :]
Alexandre
fonte
11
Observe que tive um pequeno problema ao usar 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 usar squeezeem objetos de comprimento desconhecido (por exemplo, com groupby).
IanS
2
"Obrigado! Df.squeeze () funcionou quando df.iloc [:, 0] e df.ix [:, 0] produziram muitos erros de índices"
Afflatus
4
E por que o inverso de to_framenão to_seriesou pd.Series(df)...?
jhin de
4
Você não precisa.T
elgehelge
1
@IanS passe o argumento df.squeeze(axis=0)ou df.squeeze(axis=1)(dependendo do eixo que você deseja conservar) para evitar isso
Nicolas Fonteyne
4

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.

Tauseef Malik
fonte
4

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:

df.stack()

Você obtém seu dataframe em série

Omo inteligente
fonte
0
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"

user12230680
fonte
5
Bem-vindo ao Stack Overflow! Como isso responde à pergunta? Seu código não retorna uma série como a pergunta pergunta
Gricey