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!
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'>
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, :]
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
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.