Conversion pandas data frame en série

<!-Je suis un peu nouveau aux pandas. J'ai une base de données pandas qui est de 1 ligne par 23 colonnes.

je veux convertir ceci en une série? Je me demande Quelle est la façon la plus pythonique de faire ça?

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 réaliser que c'est toujours un "vecteur" en termes mathématiques.

Merci!

32
demandé sur user1357015 2015-10-21 00:05:48

3 réponses

ce n'est pas assez intelligent pour réaliser que c'est toujours un "vecteur" en termes mathématiques.

dites plutôt que c'est assez intelligent pour reconnaître une différence de dimensionnalité. : -)

je pense que la chose la plus simple que vous pouvez faire est de sélectionner cette ligne positionnellement en utilisant iloc, qui vous donne une série avec les colonnes comme nouvel indice 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'>
28
répondu DSM 2015-10-20 21:21:08

vous pouvez transposer la dataframe à une seule ligne (qui produit encore une dataframe) et ensuite presser les résultats dans 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()
a0    0
a1    1
a2    2
a3    3
a4    4
Name: 0, dtype: int64

Remarque: pour accommoder le point soulevé par @IanS (même si ce n'est pas dans la question de L'OP), tester la taille de la base de données. Je suis en supposant que df est une dataframe, mais les arêtes sont une dataframe vide, une dataframe de forme (1, 1), et une dataframe avec plus d'un ligne dans laquelle cas l'utilisation devrait mettre en œuvre leur fonctionnalité désirée.

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

cela peut aussi ê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, :]
21
répondu Alexander 2018-04-11 18:31:53

Vous pouvez récupérer la série en découpant votre dataframe en utilisant l'une de ces deux méthodes:

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
15
répondu themachinist 2015-10-20 21:33:09