Je suis un peu nouveau pour les pandas. J'ai une trame de données pandas de 1 ligne par 23 colonnes.
Je veux convertir cela en une série? Je me demande quelle est la façon la plus pythonique de faire cela?
J'ai essayé pd.Series(myResults)
mais ça 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!
df.T
df.T
ne produit pas de Series, cependant, juste un DataFrame transposé.df.iloc
est que si vous avez un df vide, cela lèvera un fichierIndexError
. Pour éviter cela, après avoir transposé votre df, utilisez ladf.squeeze
méthode. Réf. à pandas.pydata.org/pandas-docs/stable/reference/api/…Vous pouvez transposer la trame de données à une ligne (qui aboutit toujours à une trame de données), puis 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() # 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 prendre en compte le point soulevé par @IanS (même si ce n'est pas dans la question de l'OP), testez la taille du dataframe. Je suppose que
df
c'est une trame de données, mais les cas extrêmes sont une trame de données vide, une trame de données de forme (1, 1) et une trame de données avec plus d'une ligne, auquel cas l'utilisation doit implémenter la fonctionnalité souhaité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 également être simplifié selon 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, :]
la source
squeeze
. Pour un dataframe de forme,(1, 1)
il renverra, non pas une série de longueur 1, mais un scalaire numpy. Cela a conduit à un bug difficile à attraper lors de l'utilisationsqueeze
sur des objets de longueur inconnue (par exemple avecgroupby
).to_frame
nonto_series
oupd.Series(df)
...?.T
df.squeeze(axis=0)
oudf.squeeze(axis=1)
(selon l'axe que vous voulez conserver) pour éviter çaVous pouvez récupérer la série en découpant votre dataframe à l'aide de 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
la source
Autrement -
Supposons que myResult est le dataFrame qui contient vos données sous la forme de 1 col et 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.
la source
Vous pouvez également utiliser stack ()
df= DataFrame([list(range(5))], columns = [“a{}”.format(I) for I in range(5)])
Après avoir exécuté df, puis exécutez:
Vous obtenez votre dataframe en série
la source
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)
Cela donne une trame de données avec un index comme nom de colonne de données et toutes les données sont présentes dans la colonne «valeurs»
la source