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!

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'>

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, :]

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.


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


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"


5
Bem-vindo ao Stack Overflow! Como isso responde à pergunta? Seu código não retorna uma série como a pergunta pergunta
Gricey
Ao utilizar nosso site, você reconhece que leu e compreendeu nossa Política de Cookies e nossa Política de Privacidade.
Licensed under cc by-sa 3.0 with attribution required.