web-dev-qa-db-fra.com

Conversion du cadre de données de pandas en série

Je suis un peu nouveau pour les pandas. J'ai un cadre de données sur les pandas composé d'une rangée sur 23 colonnes.

Je veux convertir cela en une série? Je me demande quelle est la façon la plus pythonique de le faire?

J'ai essayé pd.Series(myResults) mais il se plaint ValueError: cannot copy sequence with size 23 to array axis with dimension 1. Ce n'est pas assez intelligent pour se rendre compte que c'est toujours un "vecteur" en termes de mathématiques. 

Merci!

44
user1357015

Ce n'est pas assez intelligent pour se rendre compte que c'est toujours un "vecteur" en termes de mathématiques.

Dites plutôt qu'il est assez intelligent de reconnaître une différence de dimensionnalité. :-)

Je pense que la chose la plus simple que vous puissiez faire est de sélectionner cette ligne à l'aide de iloc, ce qui vous donne une série avec les colonnes comme nouvel index et les valeurs comme valeurs:

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

Vous pouvez transposer la trame de données à une seule ligne (qui produit toujours une trame de données), puis squeeze les résultats en une série (l'inverse 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

Remarque: Pour résoudre le problème soulevé par @IanS (même si cela ne figure pas dans la question du PO), testez la taille de la trame de données. Je suppose que df est un cadre de données, mais les cas Edge sont un cadre de données vide, un cadre de données de forme (1, 1) et un cadre de données comportant plusieurs lignes, auquel cas l'utilisation doit implémenter les fonctionnalités souhaitées.

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

Ceci peut également être simplifié dans le sens de la réponse fournie par @themachinist.

if len(df) > 1:
    # Dataframe with multiple rows.  Implement desired behavior.
    pass
else:
    result = pd.Series() if df.empty else df.iloc[0, :]
26
Alexander

Vous pouvez récupérer la série en découpant votre cadre de données en utilisant l'une des deux méthodes suivantes:

http://pandas.pydata.org/pandas-docs/stable/generated/pandas.DataFrame.iloc.htmlhttp://pandas.pydata.org/pandas-docs/stable/ généré/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
20
themachinist

Autrement -

Supposons que myResult soit le dataFrame qui contient vos données sous la forme de 1 colonne et de 23 lignes

// 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 la même manière, vous pouvez obtenir des séries de Dataframe avec plusieurs colonnes.

0
Tauseef Malik