Conversion pandas data frame en série
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!
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'>
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, :]
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